From 1e8f2f79c73ccd61ce895bcf7852e82d77c7c12d Mon Sep 17 00:00:00 2001 From: Sergey Popovichev Date: Wed, 17 Feb 2016 10:11:00 +0300 Subject: [PATCH] 1.0.1.7 --- COPYING | 674 ++++++ README.md | 6 +- demo/r1/demo_reports/categories.lrxml | 170 ++ ...eport1_report_header_group_subdetail.lrxml | 632 ++++++ demo/r1/demo_reports/northwind.db | Bin 0 -> 925696 bytes demo/r1/demo_reports/png/Beverage.png | Bin 0 -> 72283 bytes demo/r1/demo_reports/png/Condiments.png | Bin 0 -> 52335 bytes demo/r1/demo_reports/png/Confections.png | Bin 0 -> 93774 bytes demo/r1/demo_reports/png/Confections1.png | Bin 0 -> 64048 bytes demo/r1/demo_reports/png/Confections2.png | Bin 0 -> 37359 bytes demo/r1/demo_reports/png/Dairy_Products.png | Bin 0 -> 36952 bytes demo/r1/demo_reports/png/Grains_Cereals.png | Bin 0 -> 60122 bytes demo/r1/demo_reports/png/Grains_Cereals1.png | Bin 0 -> 66362 bytes demo/r1/demo_reports/png/Meat_Poultry.png | Bin 0 -> 70514 bytes demo/r1/demo_reports/png/Produce.png | Bin 0 -> 67390 bytes demo/r1/demo_reports/png/Seafood.png | Bin 0 -> 67298 bytes demo/r1/images/logo.png | Bin 0 -> 18975 bytes demo/r1/images/lr.png | Bin 0 -> 328 bytes demo/r1/lr1.ico | Bin 0 -> 323550 bytes demo/r1/lr2.ico | Bin 0 -> 323550 bytes demo/r1/lr3.ico | Bin 0 -> 323550 bytes demo/r1/lr4.ico | Bin 0 -> 323550 bytes demo/r1/lr5.ico | Bin 0 -> 323550 bytes demo/r1/lr6.ico | Bin 0 -> 323550 bytes demo/r1/main.cpp | 42 + demo/r1/main.ico | Bin 0 -> 323550 bytes demo/r1/mainicon.rc | 1 + demo/r1/mainwindow.cpp | 196 ++ demo/r1/mainwindow.h | 80 + demo/r1/mainwindow.ui | 213 ++ demo/r1/r1.pro | 44 + demo/r1/r1.qrc | 9 + include/lrcallbackdatasourceintf.h | 24 + include/lrdatasourcemanagerintf.h | 54 + include/lrglobal.cpp | 40 + include/lrglobal.h | 76 + include/lrreportengine.h | 105 + include/lrscriptenginemanagerintf.h | 49 + lib/.gitignore | 5 + limereport.pro | 45 + qzint.pri | 64 + report-lib.pri | 228 +++ report-lib_ru.ts | 1466 +++++++++++++ src/acollection.cpp | 30 + src/areportpreviewwidget.h | 48 + src/bands/lrdataband.cpp | 74 + src/bands/lrdataband.h | 55 + src/bands/lrgroupbands.cpp | 156 ++ src/bands/lrgroupbands.h | 76 + src/bands/lrpagefooter.cpp | 66 + src/bands/lrpagefooter.h | 50 + src/bands/lrpageheader.cpp | 70 + src/bands/lrpageheader.h | 48 + src/bands/lrreportfooter.cpp | 71 + src/bands/lrreportfooter.h | 51 + src/bands/lrreportheader.cpp | 64 + src/bands/lrreportheader.h | 49 + src/bands/lrsubdetailband.cpp | 153 ++ src/bands/lrsubdetailband.h | 89 + src/base/lrattribsabstractfactory.h | 82 + src/base/lrsimpleabstractfactory.h | 103 + src/base/lrsingleton.h | 59 + src/databrowser/images/add.png | Bin 0 -> 387 bytes src/databrowser/images/check.png | Bin 0 -> 617 bytes src/databrowser/images/check_circle.png | Bin 0 -> 933 bytes src/databrowser/images/cursor-small.png | Bin 0 -> 397 bytes src/databrowser/images/data.png | Bin 0 -> 1065 bytes src/databrowser/images/data1.png | Bin 0 -> 698 bytes src/databrowser/images/data_add.png | Bin 0 -> 1178 bytes src/databrowser/images/data_add1.png | Bin 0 -> 726 bytes src/databrowser/images/data_delete.png | Bin 0 -> 1256 bytes src/databrowser/images/data_delete1.png | Bin 0 -> 936 bytes src/databrowser/images/data_edit.png | Bin 0 -> 1293 bytes src/databrowser/images/data_edit1.png | Bin 0 -> 884 bytes src/databrowser/images/database_connect.png | Bin 0 -> 1325 bytes src/databrowser/images/database_connected.png | Bin 0 -> 1487 bytes .../images/database_connected2.png | Bin 0 -> 1378 bytes .../images/database_connected3.png | Bin 0 -> 890 bytes .../images/database_disconnect.png | Bin 0 -> 1341 bytes src/databrowser/images/edit_table.png | Bin 0 -> 1000 bytes src/databrowser/images/error.png | Bin 0 -> 917 bytes src/databrowser/images/error_message.png | Bin 0 -> 508 bytes src/databrowser/images/error_message_2.png | Bin 0 -> 761 bytes src/databrowser/images/field.png | Bin 0 -> 294 bytes src/databrowser/images/greenled.png | Bin 0 -> 537 bytes src/databrowser/images/note_edit.png | Bin 0 -> 1511 bytes src/databrowser/images/plug-connect.png | Bin 0 -> 1370 bytes .../images/plug-disconnect-slash.png | Bin 0 -> 1520 bytes src/databrowser/images/plug-disconnect.png | Bin 0 -> 1416 bytes src/databrowser/images/pointer.png | Bin 0 -> 157 bytes src/databrowser/images/remove.png | Bin 0 -> 1315 bytes src/databrowser/images/row.png | Bin 0 -> 692 bytes src/databrowser/images/table.png | Bin 0 -> 717 bytes src/databrowser/images/table_add.png | Bin 0 -> 411 bytes src/databrowser/images/table_db.png | Bin 0 -> 1494 bytes src/databrowser/images/table_delete.png | Bin 0 -> 904 bytes src/databrowser/images/table_delete1.png | Bin 0 -> 635 bytes src/databrowser/images/table_edit.png | Bin 0 -> 537 bytes src/databrowser/images/table_error.png | Bin 0 -> 725 bytes src/databrowser/images/table_error1.png | Bin 0 -> 497 bytes src/databrowser/images/table_good.png | Bin 0 -> 713 bytes src/databrowser/images/table_good1.png | Bin 0 -> 489 bytes src/databrowser/images/table_view.png | Bin 0 -> 1102 bytes src/databrowser/images/table_view1.png | Bin 0 -> 577 bytes src/databrowser/images/value.png | Bin 0 -> 909 bytes src/databrowser/images/value1.png | Bin 0 -> 814 bytes src/databrowser/images/value_add.png | Bin 0 -> 1327 bytes src/databrowser/images/value_add1.png | Bin 0 -> 767 bytes src/databrowser/images/value_add2.png | Bin 0 -> 775 bytes src/databrowser/images/value_delete.png | Bin 0 -> 1433 bytes src/databrowser/images/value_delete1.png | Bin 0 -> 929 bytes src/databrowser/images/value_edit.png | Bin 0 -> 1396 bytes src/databrowser/images/value_edit1.png | Bin 0 -> 901 bytes src/databrowser/images/value_edit2.png | Bin 0 -> 912 bytes src/databrowser/lrconnectiondialog.cpp | 149 ++ src/databrowser/lrconnectiondialog.h | 67 + src/databrowser/lrconnectiondialog.ui | 249 +++ src/databrowser/lrdatabrowser.cpp | 705 +++++++ src/databrowser/lrdatabrowser.h | 115 ++ src/databrowser/lrdatabrowser.qrc | 47 + src/databrowser/lrdatabrowser.ui | 484 +++++ src/databrowser/lrdatabrowsertree.cpp | 47 + src/databrowser/lrdatabrowsertree.h | 48 + src/databrowser/lrsqleditdialog.cpp | 343 ++++ src/databrowser/lrsqleditdialog.h | 109 + src/databrowser/lrsqleditdialog.ui | 859 ++++++++ src/databrowser/lrvariabledialog.cpp | 99 + src/databrowser/lrvariabledialog.h | 65 + src/databrowser/lrvariabledialog.ui | 131 ++ src/images/Control-Edit Box.png | Bin 0 -> 618 bytes src/images/Hourglass_80.png | Bin 0 -> 5825 bytes src/images/addBand.png | Bin 0 -> 401 bytes src/images/addBand1.png | Bin 0 -> 427 bytes src/images/allLines.png | Bin 0 -> 201 bytes src/images/allLines1.png | Bin 0 -> 211 bytes src/images/barcode.png | Bin 0 -> 4488 bytes src/images/barcode1.png | Bin 0 -> 877 bytes src/images/barcode2.png | Bin 0 -> 229 bytes src/images/barcode3_16.png | Bin 0 -> 521 bytes src/images/barcode3_24.png | Bin 0 -> 665 bytes src/images/bottomLine.png | Bin 0 -> 209 bytes src/images/bottomLine1.png | Bin 0 -> 217 bytes src/images/bringToFront.png | Bin 0 -> 497 bytes src/images/closebox.png | Bin 0 -> 18315 bytes src/images/copy.png | Bin 0 -> 820 bytes src/images/copy16.png | Bin 0 -> 503 bytes src/images/copy2.png | Bin 0 -> 769 bytes src/images/copy24.png | Bin 0 -> 862 bytes src/images/copy_2_16.png | Bin 0 -> 527 bytes src/images/copy_2_24.png | Bin 0 -> 998 bytes src/images/cpyright_logo.png | Bin 0 -> 595 bytes src/images/cut.png | Bin 0 -> 891 bytes src/images/cut1.png | Bin 0 -> 581 bytes src/images/cut16.png | Bin 0 -> 727 bytes src/images/cut24.png | Bin 0 -> 1236 bytes src/images/cut_1_24.png | Bin 0 -> 1072 bytes src/images/cut_24.png | Bin 0 -> 983 bytes src/images/dasabases.png | Bin 0 -> 826 bytes src/images/database.png | Bin 0 -> 698 bytes src/images/delete.png | Bin 0 -> 4304 bytes src/images/delete1.png | Bin 0 -> 1243 bytes src/images/design.png | Bin 0 -> 19280 bytes src/images/dialog-close.png | Bin 0 -> 2570 bytes src/images/dialog-close_red.png | Bin 0 -> 2584 bytes src/images/disk_blue.png | Bin 0 -> 1313 bytes src/images/document-new_16.png | Bin 0 -> 600 bytes src/images/document-new_24.png | Bin 0 -> 917 bytes src/images/document_add.png | Bin 0 -> 1000 bytes src/images/document_add_1.png | Bin 0 -> 955 bytes src/images/document_delete_16.png | Bin 0 -> 935 bytes src/images/document_delete_24.png | Bin 0 -> 1586 bytes src/images/document_zoom_in.png | Bin 0 -> 1214 bytes src/images/document_zoom_in_1.png | Bin 0 -> 1148 bytes src/images/document_zoom_out.png | Bin 0 -> 1208 bytes src/images/document_zoom_out_1.png | Bin 0 -> 1135 bytes src/images/edit-copy_1_16.png | Bin 0 -> 498 bytes src/images/edit-copy_1_24.png | Bin 0 -> 725 bytes src/images/edit-paste_1_16.png | Bin 0 -> 557 bytes src/images/edit-paste_1_24.png | Bin 0 -> 1015 bytes src/images/edit-paste_2_24.png | Bin 0 -> 1167 bytes src/images/edit.png | Bin 0 -> 661 bytes src/images/edit_control_24.png | Bin 0 -> 1090 bytes src/images/edit_control_2_24.png | Bin 0 -> 344 bytes src/images/edit_control_3_24.png | Bin 0 -> 353 bytes src/images/edit_cursor.png | Bin 0 -> 5797 bytes src/images/edit_layout.png | Bin 0 -> 1205 bytes src/images/edit_layout_2_24.png | Bin 0 -> 1190 bytes src/images/edit_layout_3_24.png | Bin 0 -> 608 bytes src/images/edit_layout_4_24.png | Bin 0 -> 620 bytes src/images/edit_pecil2.png | Bin 0 -> 1734 bytes src/images/edit_pencil.png | Bin 0 -> 1706 bytes src/images/errors.png | Bin 0 -> 353 bytes src/images/field.png | Bin 0 -> 294 bytes src/images/first2.png | Bin 0 -> 301 bytes src/images/folder.png | Bin 0 -> 1176 bytes src/images/folder1.png | Bin 0 -> 1023 bytes src/images/folder3.png | Bin 0 -> 351 bytes src/images/function.png | Bin 0 -> 526 bytes src/images/function2.png | Bin 0 -> 515 bytes src/images/function3.png | Bin 0 -> 505 bytes src/images/go-next.png | Bin 0 -> 2048 bytes src/images/hlayout.png | Bin 0 -> 444 bytes src/images/hlayuot_1_24.png | Bin 0 -> 434 bytes src/images/hlayuot_2_24.png | Bin 0 -> 427 bytes src/images/hlayuot_3_24.png | Bin 0 -> 430 bytes src/images/hourglass.png | Bin 0 -> 9953 bytes src/images/insert-text_16.png | Bin 0 -> 592 bytes src/images/insert-text_1_24.png | Bin 0 -> 718 bytes src/images/insert-text_24.png | Bin 0 -> 846 bytes src/images/last2.png | Bin 0 -> 289 bytes src/images/layuot_create.png | Bin 0 -> 866 bytes src/images/layuot_create_24.png | Bin 0 -> 878 bytes src/images/layuot_delete_24.png | Bin 0 -> 673 bytes src/images/layuot_move.png | Bin 0 -> 698 bytes src/images/layuot_select.png | Bin 0 -> 682 bytes src/images/layuot_select_24.png | Bin 0 -> 829 bytes src/images/leftLine.png | Bin 0 -> 219 bytes src/images/leftLine1.png | Bin 0 -> 227 bytes src/images/logo.png | Bin 0 -> 18975 bytes src/images/logo_100.png | Bin 0 -> 3096 bytes src/images/main.ico | Bin 0 -> 323550 bytes src/images/main.png | Bin 0 -> 794 bytes src/images/move_back.png | Bin 0 -> 903 bytes src/images/move_top_1.png | Bin 0 -> 846 bytes src/images/new_1_16.png | Bin 0 -> 691 bytes src/images/new_1_24.png | Bin 0 -> 1026 bytes src/images/new_leaf.png | Bin 0 -> 691 bytes src/images/new_leaf1.png | Bin 0 -> 637 bytes src/images/next.png | Bin 0 -> 1923 bytes src/images/next1.png | Bin 0 -> 283 bytes src/images/next2.png | Bin 0 -> 284 bytes src/images/noLines.png | Bin 0 -> 202 bytes src/images/noLines1.png | Bin 0 -> 202 bytes src/images/paste.png | Bin 0 -> 773 bytes src/images/paste1.png | Bin 0 -> 727 bytes src/images/paste16.png | Bin 0 -> 529 bytes src/images/paste24.png | Bin 0 -> 927 bytes src/images/paste_1_24.png | Bin 0 -> 781 bytes src/images/pin_green.png | Bin 0 -> 638 bytes src/images/prin-preview2.png | Bin 0 -> 1442 bytes src/images/prin-preview_2.png | Bin 0 -> 1453 bytes src/images/prin-preview_3.png | Bin 0 -> 1518 bytes src/images/prin-preview_4_24.png | Bin 0 -> 1217 bytes src/images/print.png | Bin 0 -> 456 bytes src/images/print2_big.png | Bin 0 -> 4192 bytes src/images/print_2.png | Bin 0 -> 930 bytes src/images/print_2_24.png | Bin 0 -> 912 bytes src/images/print_preview.png | Bin 0 -> 630 bytes src/images/print_preview1.png | Bin 0 -> 683 bytes src/images/print_preview2.png | Bin 0 -> 735 bytes src/images/prior.png | Bin 0 -> 1321 bytes src/images/prior1.png | Bin 0 -> 281 bytes src/images/prior2.png | Bin 0 -> 277 bytes src/images/redo.png | Bin 0 -> 733 bytes src/images/redo1.png | Bin 0 -> 1155 bytes src/images/redo_1_16.png | Bin 0 -> 875 bytes src/images/redo_1_24.png | Bin 0 -> 870 bytes src/images/rightLine.png | Bin 0 -> 214 bytes src/images/rightLine1.png | Bin 0 -> 209 bytes src/images/save.png | Bin 0 -> 557 bytes src/images/save_1_16.png | Bin 0 -> 569 bytes src/images/save_1_24.png | Bin 0 -> 833 bytes src/images/save_as_1_16.png | Bin 0 -> 769 bytes src/images/save_as_1_24.png | Bin 0 -> 1005 bytes src/images/sendToBack.png | Bin 0 -> 431 bytes src/images/table.png | Bin 0 -> 268 bytes src/images/table1.png | Bin 0 -> 269 bytes src/images/text-align-botom.png | Bin 0 -> 213 bytes src/images/text-align-botom1.png | Bin 0 -> 220 bytes src/images/text-align-justify.png | Bin 0 -> 209 bytes src/images/text-align-justify1.png | Bin 0 -> 217 bytes src/images/text-align-top.png | Bin 0 -> 221 bytes src/images/text-align-top1.png | Bin 0 -> 230 bytes src/images/text-align-v-center.png | Bin 0 -> 212 bytes src/images/text-align-v-center1.png | Bin 0 -> 220 bytes src/images/text_align_center.png | Bin 0 -> 234 bytes src/images/text_align_center1.png | Bin 0 -> 350 bytes src/images/text_align_left.png | Bin 0 -> 209 bytes src/images/text_align_left1.png | Bin 0 -> 337 bytes src/images/text_align_right.png | Bin 0 -> 209 bytes src/images/text_align_right1.png | Bin 0 -> 337 bytes src/images/text_bold.png | Bin 0 -> 304 bytes src/images/text_bold1.png | Bin 0 -> 466 bytes src/images/text_italic.png | Bin 0 -> 223 bytes src/images/text_italic1.png | Bin 0 -> 345 bytes src/images/text_underline.png | Bin 0 -> 273 bytes src/images/text_underline1.png | Bin 0 -> 417 bytes src/images/toBack.png | Bin 0 -> 388 bytes src/images/toBottom.png | Bin 0 -> 315 bytes src/images/toCenter.png | Bin 0 -> 313 bytes src/images/toFront.png | Bin 0 -> 387 bytes src/images/toLeft1.png | Bin 0 -> 306 bytes src/images/toRight.png | Bin 0 -> 315 bytes src/images/toSameHeight.png | Bin 0 -> 319 bytes src/images/toSameWidth.png | Bin 0 -> 324 bytes src/images/toTop.png | Bin 0 -> 311 bytes src/images/toVCernter.png | Bin 0 -> 315 bytes src/images/to_bottom.png | Bin 0 -> 407 bytes src/images/to_bottom_2.png | Bin 0 -> 3161 bytes src/images/to_center.png | Bin 0 -> 390 bytes src/images/to_center_2.png | Bin 0 -> 3097 bytes src/images/to_h_center.png | Bin 0 -> 429 bytes src/images/to_h_center_2.png | Bin 0 -> 3114 bytes src/images/to_left.png | Bin 0 -> 375 bytes src/images/to_left_2.png | Bin 0 -> 3126 bytes src/images/to_right.png | Bin 0 -> 380 bytes src/images/to_right_2.png | Bin 0 -> 3132 bytes src/images/to_same_height.png | Bin 0 -> 444 bytes src/images/to_same_height_2.png | Bin 0 -> 3019 bytes src/images/to_same_width.png | Bin 0 -> 408 bytes src/images/to_same_width_2.png | Bin 0 -> 3005 bytes src/images/to_top.png | Bin 0 -> 401 bytes src/images/to_top_2.png | Bin 0 -> 3154 bytes src/images/topLine.png | Bin 0 -> 214 bytes src/images/topLine1.png | Bin 0 -> 230 bytes src/images/undo.png | Bin 0 -> 744 bytes src/images/undo1.png | Bin 0 -> 1119 bytes src/images/undo_1_16.png | Bin 0 -> 847 bytes src/images/undo_1_24.png | Bin 0 -> 785 bytes src/images/value.png | Bin 0 -> 887 bytes src/images/var1.png | Bin 0 -> 507 bytes src/images/variable.png | Bin 0 -> 482 bytes src/images/variable1.png | Bin 0 -> 436 bytes src/images/vlayout.png | Bin 0 -> 483 bytes src/images/zoom-in_1_16.png | Bin 0 -> 692 bytes src/images/zoom-in_1_24.png | Bin 0 -> 1049 bytes src/images/zoom-in_2_16.png | Bin 0 -> 802 bytes src/images/zoom-out_1_16.png | Bin 0 -> 688 bytes src/images/zoom-out_1_24.png | Bin 0 -> 1020 bytes src/images/zoom_in.png | Bin 0 -> 671 bytes src/images/zoom_in1.png | Bin 0 -> 687 bytes src/images/zoom_out.png | Bin 0 -> 666 bytes src/images/zoom_out1.png | Bin 0 -> 682 bytes src/items/abordertextitem.cpp | 323 +++ src/items/abordertextitem.h | 110 + src/items/editors/lrfonteditorwidget.cpp | 147 ++ src/items/editors/lrfonteditorwidget.h | 73 + src/items/editors/lritemeditorwidget.cpp | 91 + src/items/editors/lritemeditorwidget.h | 65 + .../editors/lritemsaligneditorwidget.cpp | 171 ++ src/items/editors/lritemsaligneditorwidget.h | 77 + .../editors/lritemsborderseditorwidget.cpp | 154 ++ .../editors/lritemsborderseditorwidget.h | 67 + .../editors/lrtextalignmenteditorwidget.cpp | 190 ++ .../editors/lrtextalignmenteditorwidget.h | 73 + src/items/images/Control-Edit Box.png | Bin 0 -> 618 bytes src/items/images/DataBand.png | Bin 0 -> 204 bytes src/items/images/DataBand16.png | Bin 0 -> 158 bytes src/items/images/GroupFooter16.png | Bin 0 -> 149 bytes src/items/images/GroupHeader16.png | Bin 0 -> 159 bytes src/items/images/PageFooter.png | Bin 0 -> 192 bytes src/items/images/PageFooter16.png | Bin 0 -> 149 bytes src/items/images/PageHeader.png | Bin 0 -> 184 bytes src/items/images/PageHeader16.png | Bin 0 -> 158 bytes src/items/images/ReportFooter.png | Bin 0 -> 193 bytes src/items/images/ReportFooter16.png | Bin 0 -> 149 bytes src/items/images/ReportHeader.png | Bin 0 -> 185 bytes src/items/images/ReportHeader16.png | Bin 0 -> 159 bytes src/items/images/ReportPage.png | Bin 0 -> 182 bytes src/items/images/ReportPage16.png | Bin 0 -> 143 bytes src/items/images/SubDetailBand16.png | Bin 0 -> 158 bytes src/items/images/SubDetailFooterBand16.png | Bin 0 -> 149 bytes src/items/images/SubDetailHeaderBand16.png | Bin 0 -> 154 bytes src/items/images/addBand1.png | Bin 0 -> 640 bytes src/items/images/barcode2.png | Bin 0 -> 229 bytes src/items/images/hlayout.png | Bin 0 -> 444 bytes src/items/images/hlayuot_3_24.png | Bin 0 -> 430 bytes src/items/images/imageItem.png | Bin 0 -> 26375 bytes src/items/images/imageItem1.png | Bin 0 -> 25298 bytes src/items/images/imageItem2.png | Bin 0 -> 1476 bytes src/items/images/insert-text.png | Bin 0 -> 1890 bytes src/items/images/insert-text_1.png | Bin 0 -> 997 bytes src/items/images/insert-text_2.png | Bin 0 -> 1480 bytes src/items/images/insert-text_3.png | Bin 0 -> 593 bytes src/items/images/insert-text_5.png | Bin 0 -> 598 bytes src/items/images/settings.png | Bin 0 -> 509 bytes src/items/images/settings2.png | Bin 0 -> 878 bytes src/items/images/shape2.png | Bin 0 -> 538 bytes src/items/images/shape4.png | Bin 0 -> 636 bytes src/items/images/shape5.png | Bin 0 -> 662 bytes src/items/items.qrc | 37 + src/items/lralignpropitem.cpp | 165 ++ src/items/lralignpropitem.h | 80 + src/items/lrbarcodeitem.cpp | 248 +++ src/items/lrbarcodeitem.h | 173 ++ src/items/lrhorizontallayout.cpp | 432 ++++ src/items/lrhorizontallayout.h | 101 + src/items/lrimageitem.cpp | 261 +++ src/items/lrimageitem.h | 85 + src/items/lrshapeitem.cpp | 190 ++ src/items/lrshapeitem.h | 79 + src/items/lrsimpletagparser.cpp | 238 +++ src/items/lrsimpletagparser.h | 100 + src/items/lrsubitemparentpropitem.cpp | 97 + src/items/lrsubitemparentpropitem.h | 58 + src/items/lrtextitem.cpp | 504 +++++ src/items/lrtextitem.h | 136 ++ src/items/lrtextitemeditor.cpp | 356 ++++ src/items/lrtextitemeditor.h | 106 + src/items/lrtextitemeditor.ui | 251 +++ src/lraboutdialog.cpp | 44 + src/lraboutdialog.h | 51 + src/lraboutdialog.ui | 264 +++ src/lrbanddesignintf.cpp | 729 +++++++ src/lrbanddesignintf.h | 253 +++ src/lrbandsmanager.cpp | 93 + src/lrbandsmanager.h | 50 + src/lrbasedesignintf.cpp | 1100 ++++++++++ src/lrbasedesignintf.h | 333 +++ src/lrcallbackdatasourceintf.h | 24 + src/lrcollection.h | 57 + src/lrdatadesignintf.cpp | 583 ++++++ src/lrdatadesignintf.h | 404 ++++ src/lrdatasourcemanager.cpp | 1035 ++++++++++ src/lrdatasourcemanager.h | 229 +++ src/lrdatasourcemanagerintf.h | 54 + src/lrdesignelementsfactory.h | 65 + src/lrglobal.cpp | 40 + src/lrglobal.h | 76 + src/lrgroupfunctions.cpp | 173 ++ src/lrgroupfunctions.h | 150 ++ src/lritemdesignintf.cpp | 239 +++ src/lritemdesignintf.h | 97 + src/lrpagedesignintf.cpp | 1816 +++++++++++++++++ src/lrpagedesignintf.h | 409 ++++ src/lrpageitemdesignintf.cpp | 486 +++++ src/lrpageitemdesignintf.h | 127 ++ src/lrpreviewreportwindow.cpp | 410 ++++ src/lrpreviewreportwindow.h | 97 + src/lrpreviewreportwindow.ui | 367 ++++ src/lrreportdesignwidget.cpp | 361 ++++ src/lrreportdesignwidget.h | 135 ++ src/lrreportdesignwindow.cpp | 908 +++++++++ src/lrreportdesignwindow.h | 213 ++ src/lrreportengine.cpp | 587 ++++++ src/lrreportengine.h | 105 + src/lrreportengine_p.h | 126 ++ src/lrreportrender.cpp | 680 ++++++ src/lrreportrender.h | 151 ++ src/lrscriptenginemanager.cpp | 459 +++++ src/lrscriptenginemanager.h | 208 ++ src/lrscriptenginemanagerintf.h | 49 + src/lrserializatorsfactory.cpp | 30 + src/lrserializatorsfactory.h | 51 + src/lrsimplecrypt.cpp | 183 ++ src/lrsimplecrypt.h | 52 + src/lrvariablesholder.cpp | 147 ++ src/lrvariablesholder.h | 102 + .../editors/lrbuttonlineeditor.cpp | 140 ++ .../editors/lrbuttonlineeditor.h | 66 + .../editors/lrcheckboxeditor.cpp | 115 ++ .../editors/lrcheckboxeditor.h | 64 + src/objectinspector/editors/lrcoloreditor.cpp | 72 + src/objectinspector/editors/lrcoloreditor.h | 56 + .../editors/lrcomboboxeditor.cpp | 140 ++ .../editors/lrcomboboxeditor.h | 76 + src/objectinspector/editors/lrfonteditor.cpp | 81 + src/objectinspector/editors/lrfonteditor.h | 57 + src/objectinspector/editors/lrimageeditor.cpp | 56 + src/objectinspector/editors/lrimageeditor.h | 52 + .../editors/lrtextitempropertyeditor.cpp | 55 + .../editors/lrtextitempropertyeditor.h | 56 + .../editors/ltextitempropertyeditor.ui | 80 + src/objectinspector/images/check.png | Bin 0 -> 447 bytes src/objectinspector/images/check_w.png | Bin 0 -> 576 bytes src/objectinspector/images/checked.png | Bin 0 -> 343 bytes src/objectinspector/images/clear.png | Bin 0 -> 723 bytes src/objectinspector/images/edit_16.ico | Bin 0 -> 1150 bytes src/objectinspector/images/uncheck.png | Bin 0 -> 237 bytes src/objectinspector/images/uncheck_w.png | Bin 0 -> 226 bytes src/objectinspector/images/unchecked.png | Bin 0 -> 242 bytes src/objectinspector/lobjectinspector.qrc | 10 + .../lrbasedesignobjectmodel.cpp | 51 + src/objectinspector/lrbasedesignobjectmodel.h | 43 + .../lrobjectinspectorwidget.cpp | 158 ++ src/objectinspector/lrobjectinspectorwidget.h | 64 + src/objectinspector/lrobjectitemmodel.cpp | 357 ++++ src/objectinspector/lrobjectitemmodel.h | 94 + src/objectinspector/lrobjectpropitem.cpp | 181 ++ src/objectinspector/lrobjectpropitem.h | 139 ++ src/objectinspector/lrpropertydelegate.cpp | 165 ++ src/objectinspector/lrpropertydelegate.h | 68 + .../propertyItems/lrboolpropitem.cpp | 92 + .../propertyItems/lrboolpropitem.h | 51 + .../propertyItems/lrcolorpropitem.cpp | 76 + .../propertyItems/lrcolorpropitem.h | 51 + .../propertyItems/lrdatasourcepropitem.cpp | 103 + .../propertyItems/lrdatasourcepropitem.h | 61 + .../propertyItems/lrenumpropitem.cpp | 107 + .../propertyItems/lrenumpropitem.h | 60 + .../propertyItems/lrflagspropitem.cpp | 147 ++ .../propertyItems/lrflagspropitem.h | 71 + .../propertyItems/lrfontpropitem.cpp | 159 ++ .../propertyItems/lrfontpropitem.h | 92 + .../propertyItems/lrgroupfieldpropitem.cpp | 76 + .../propertyItems/lrgroupfieldpropitem.h | 49 + .../propertyItems/lrimagepropitem.cpp | 71 + .../propertyItems/lrimagepropitem.h | 51 + .../propertyItems/lrintpropitem.cpp | 65 + .../propertyItems/lrintpropitem.h | 50 + .../propertyItems/lrqrealpropitem.cpp | 67 + .../propertyItems/lrqrealpropitem.h | 52 + .../propertyItems/lrrectproptem.cpp | 210 ++ .../propertyItems/lrrectproptem.h | 72 + .../propertyItems/lrstringpropitem.cpp | 72 + .../propertyItems/lrstringpropitem.h | 47 + src/objectsbrowser/lrobjectbrowser.cpp | 279 +++ src/objectsbrowser/lrobjectbrowser.h | 85 + src/report.qrc | 158 ++ src/serializators/aserializatorintf.cpp | 30 + src/serializators/astorageintf.cpp | 31 + src/serializators/lrserializatorintf.h | 44 + src/serializators/lrstorageintf.h | 72 + .../lrxmlbasetypesserializators.cpp | 281 +++ .../lrxmlbasetypesserializators.h | 141 ++ src/serializators/lrxmlqrectserializator.cpp | 104 + src/serializators/lrxmlqrectserializator.h | 61 + src/serializators/lrxmlreader.cpp | 228 +++ src/serializators/lrxmlreader.h | 104 + src/serializators/lrxmlserializatorsfactory.h | 55 + src/serializators/lrxmlwriter.cpp | 222 ++ src/serializators/lrxmlwriter.h | 71 + src/waitform.cpp | 44 + src/waitform.h | 51 + src/waitform.ui | 58 + 525 files changed, 35338 insertions(+), 3 deletions(-) create mode 100644 COPYING create mode 100644 demo/r1/demo_reports/categories.lrxml create mode 100644 demo/r1/demo_reports/demoReport1_report_header_group_subdetail.lrxml create mode 100644 demo/r1/demo_reports/northwind.db create mode 100644 demo/r1/demo_reports/png/Beverage.png create mode 100644 demo/r1/demo_reports/png/Condiments.png create mode 100644 demo/r1/demo_reports/png/Confections.png create mode 100644 demo/r1/demo_reports/png/Confections1.png create mode 100644 demo/r1/demo_reports/png/Confections2.png create mode 100644 demo/r1/demo_reports/png/Dairy_Products.png create mode 100644 demo/r1/demo_reports/png/Grains_Cereals.png create mode 100644 demo/r1/demo_reports/png/Grains_Cereals1.png create mode 100644 demo/r1/demo_reports/png/Meat_Poultry.png create mode 100644 demo/r1/demo_reports/png/Produce.png create mode 100644 demo/r1/demo_reports/png/Seafood.png create mode 100644 demo/r1/images/logo.png create mode 100644 demo/r1/images/lr.png create mode 100644 demo/r1/lr1.ico create mode 100644 demo/r1/lr2.ico create mode 100644 demo/r1/lr3.ico create mode 100644 demo/r1/lr4.ico create mode 100644 demo/r1/lr5.ico create mode 100644 demo/r1/lr6.ico create mode 100644 demo/r1/main.cpp create mode 100644 demo/r1/main.ico create mode 100644 demo/r1/mainicon.rc create mode 100644 demo/r1/mainwindow.cpp create mode 100644 demo/r1/mainwindow.h create mode 100644 demo/r1/mainwindow.ui create mode 100644 demo/r1/r1.pro create mode 100644 demo/r1/r1.qrc create mode 100644 include/lrcallbackdatasourceintf.h create mode 100644 include/lrdatasourcemanagerintf.h create mode 100644 include/lrglobal.cpp create mode 100644 include/lrglobal.h create mode 100644 include/lrreportengine.h create mode 100644 include/lrscriptenginemanagerintf.h create mode 100644 lib/.gitignore create mode 100644 limereport.pro create mode 100644 qzint.pri create mode 100644 report-lib.pri create mode 100644 report-lib_ru.ts create mode 100644 src/acollection.cpp create mode 100644 src/areportpreviewwidget.h create mode 100644 src/bands/lrdataband.cpp create mode 100644 src/bands/lrdataband.h create mode 100644 src/bands/lrgroupbands.cpp create mode 100644 src/bands/lrgroupbands.h create mode 100644 src/bands/lrpagefooter.cpp create mode 100644 src/bands/lrpagefooter.h create mode 100644 src/bands/lrpageheader.cpp create mode 100644 src/bands/lrpageheader.h create mode 100644 src/bands/lrreportfooter.cpp create mode 100644 src/bands/lrreportfooter.h create mode 100644 src/bands/lrreportheader.cpp create mode 100644 src/bands/lrreportheader.h create mode 100644 src/bands/lrsubdetailband.cpp create mode 100644 src/bands/lrsubdetailband.h create mode 100644 src/base/lrattribsabstractfactory.h create mode 100644 src/base/lrsimpleabstractfactory.h create mode 100644 src/base/lrsingleton.h create mode 100644 src/databrowser/images/add.png create mode 100644 src/databrowser/images/check.png create mode 100644 src/databrowser/images/check_circle.png create mode 100644 src/databrowser/images/cursor-small.png create mode 100644 src/databrowser/images/data.png create mode 100644 src/databrowser/images/data1.png create mode 100644 src/databrowser/images/data_add.png create mode 100644 src/databrowser/images/data_add1.png create mode 100644 src/databrowser/images/data_delete.png create mode 100644 src/databrowser/images/data_delete1.png create mode 100644 src/databrowser/images/data_edit.png create mode 100644 src/databrowser/images/data_edit1.png create mode 100644 src/databrowser/images/database_connect.png create mode 100644 src/databrowser/images/database_connected.png create mode 100644 src/databrowser/images/database_connected2.png create mode 100644 src/databrowser/images/database_connected3.png create mode 100644 src/databrowser/images/database_disconnect.png create mode 100644 src/databrowser/images/edit_table.png create mode 100644 src/databrowser/images/error.png create mode 100644 src/databrowser/images/error_message.png create mode 100644 src/databrowser/images/error_message_2.png create mode 100644 src/databrowser/images/field.png create mode 100644 src/databrowser/images/greenled.png create mode 100644 src/databrowser/images/note_edit.png create mode 100644 src/databrowser/images/plug-connect.png create mode 100644 src/databrowser/images/plug-disconnect-slash.png create mode 100644 src/databrowser/images/plug-disconnect.png create mode 100644 src/databrowser/images/pointer.png create mode 100644 src/databrowser/images/remove.png create mode 100644 src/databrowser/images/row.png create mode 100644 src/databrowser/images/table.png create mode 100644 src/databrowser/images/table_add.png create mode 100644 src/databrowser/images/table_db.png create mode 100644 src/databrowser/images/table_delete.png create mode 100644 src/databrowser/images/table_delete1.png create mode 100644 src/databrowser/images/table_edit.png create mode 100644 src/databrowser/images/table_error.png create mode 100644 src/databrowser/images/table_error1.png create mode 100644 src/databrowser/images/table_good.png create mode 100644 src/databrowser/images/table_good1.png create mode 100644 src/databrowser/images/table_view.png create mode 100644 src/databrowser/images/table_view1.png create mode 100644 src/databrowser/images/value.png create mode 100644 src/databrowser/images/value1.png create mode 100644 src/databrowser/images/value_add.png create mode 100644 src/databrowser/images/value_add1.png create mode 100644 src/databrowser/images/value_add2.png create mode 100644 src/databrowser/images/value_delete.png create mode 100644 src/databrowser/images/value_delete1.png create mode 100644 src/databrowser/images/value_edit.png create mode 100644 src/databrowser/images/value_edit1.png create mode 100644 src/databrowser/images/value_edit2.png create mode 100644 src/databrowser/lrconnectiondialog.cpp create mode 100644 src/databrowser/lrconnectiondialog.h create mode 100644 src/databrowser/lrconnectiondialog.ui create mode 100644 src/databrowser/lrdatabrowser.cpp create mode 100644 src/databrowser/lrdatabrowser.h create mode 100644 src/databrowser/lrdatabrowser.qrc create mode 100644 src/databrowser/lrdatabrowser.ui create mode 100644 src/databrowser/lrdatabrowsertree.cpp create mode 100644 src/databrowser/lrdatabrowsertree.h create mode 100644 src/databrowser/lrsqleditdialog.cpp create mode 100644 src/databrowser/lrsqleditdialog.h create mode 100644 src/databrowser/lrsqleditdialog.ui create mode 100644 src/databrowser/lrvariabledialog.cpp create mode 100644 src/databrowser/lrvariabledialog.h create mode 100644 src/databrowser/lrvariabledialog.ui create mode 100644 src/images/Control-Edit Box.png create mode 100644 src/images/Hourglass_80.png create mode 100644 src/images/addBand.png create mode 100644 src/images/addBand1.png create mode 100644 src/images/allLines.png create mode 100644 src/images/allLines1.png create mode 100644 src/images/barcode.png create mode 100644 src/images/barcode1.png create mode 100644 src/images/barcode2.png create mode 100644 src/images/barcode3_16.png create mode 100644 src/images/barcode3_24.png create mode 100644 src/images/bottomLine.png create mode 100644 src/images/bottomLine1.png create mode 100644 src/images/bringToFront.png create mode 100644 src/images/closebox.png create mode 100644 src/images/copy.png create mode 100644 src/images/copy16.png create mode 100644 src/images/copy2.png create mode 100644 src/images/copy24.png create mode 100644 src/images/copy_2_16.png create mode 100644 src/images/copy_2_24.png create mode 100644 src/images/cpyright_logo.png create mode 100644 src/images/cut.png create mode 100644 src/images/cut1.png create mode 100644 src/images/cut16.png create mode 100644 src/images/cut24.png create mode 100644 src/images/cut_1_24.png create mode 100644 src/images/cut_24.png create mode 100644 src/images/dasabases.png create mode 100644 src/images/database.png create mode 100644 src/images/delete.png create mode 100644 src/images/delete1.png create mode 100644 src/images/design.png create mode 100644 src/images/dialog-close.png create mode 100644 src/images/dialog-close_red.png create mode 100644 src/images/disk_blue.png create mode 100644 src/images/document-new_16.png create mode 100644 src/images/document-new_24.png create mode 100644 src/images/document_add.png create mode 100644 src/images/document_add_1.png create mode 100644 src/images/document_delete_16.png create mode 100644 src/images/document_delete_24.png create mode 100644 src/images/document_zoom_in.png create mode 100644 src/images/document_zoom_in_1.png create mode 100644 src/images/document_zoom_out.png create mode 100644 src/images/document_zoom_out_1.png create mode 100644 src/images/edit-copy_1_16.png create mode 100644 src/images/edit-copy_1_24.png create mode 100644 src/images/edit-paste_1_16.png create mode 100644 src/images/edit-paste_1_24.png create mode 100644 src/images/edit-paste_2_24.png create mode 100644 src/images/edit.png create mode 100644 src/images/edit_control_24.png create mode 100644 src/images/edit_control_2_24.png create mode 100644 src/images/edit_control_3_24.png create mode 100644 src/images/edit_cursor.png create mode 100644 src/images/edit_layout.png create mode 100644 src/images/edit_layout_2_24.png create mode 100644 src/images/edit_layout_3_24.png create mode 100644 src/images/edit_layout_4_24.png create mode 100644 src/images/edit_pecil2.png create mode 100644 src/images/edit_pencil.png create mode 100644 src/images/errors.png create mode 100644 src/images/field.png create mode 100644 src/images/first2.png create mode 100644 src/images/folder.png create mode 100644 src/images/folder1.png create mode 100644 src/images/folder3.png create mode 100644 src/images/function.png create mode 100644 src/images/function2.png create mode 100644 src/images/function3.png create mode 100644 src/images/go-next.png create mode 100644 src/images/hlayout.png create mode 100644 src/images/hlayuot_1_24.png create mode 100644 src/images/hlayuot_2_24.png create mode 100644 src/images/hlayuot_3_24.png create mode 100644 src/images/hourglass.png create mode 100644 src/images/insert-text_16.png create mode 100644 src/images/insert-text_1_24.png create mode 100644 src/images/insert-text_24.png create mode 100644 src/images/last2.png create mode 100644 src/images/layuot_create.png create mode 100644 src/images/layuot_create_24.png create mode 100644 src/images/layuot_delete_24.png create mode 100644 src/images/layuot_move.png create mode 100644 src/images/layuot_select.png create mode 100644 src/images/layuot_select_24.png create mode 100644 src/images/leftLine.png create mode 100644 src/images/leftLine1.png create mode 100644 src/images/logo.png create mode 100644 src/images/logo_100.png create mode 100644 src/images/main.ico create mode 100644 src/images/main.png create mode 100644 src/images/move_back.png create mode 100644 src/images/move_top_1.png create mode 100644 src/images/new_1_16.png create mode 100644 src/images/new_1_24.png create mode 100644 src/images/new_leaf.png create mode 100644 src/images/new_leaf1.png create mode 100644 src/images/next.png create mode 100644 src/images/next1.png create mode 100644 src/images/next2.png create mode 100644 src/images/noLines.png create mode 100644 src/images/noLines1.png create mode 100644 src/images/paste.png create mode 100644 src/images/paste1.png create mode 100644 src/images/paste16.png create mode 100644 src/images/paste24.png create mode 100644 src/images/paste_1_24.png create mode 100644 src/images/pin_green.png create mode 100644 src/images/prin-preview2.png create mode 100644 src/images/prin-preview_2.png create mode 100644 src/images/prin-preview_3.png create mode 100644 src/images/prin-preview_4_24.png create mode 100644 src/images/print.png create mode 100644 src/images/print2_big.png create mode 100644 src/images/print_2.png create mode 100644 src/images/print_2_24.png create mode 100644 src/images/print_preview.png create mode 100644 src/images/print_preview1.png create mode 100644 src/images/print_preview2.png create mode 100644 src/images/prior.png create mode 100644 src/images/prior1.png create mode 100644 src/images/prior2.png create mode 100644 src/images/redo.png create mode 100644 src/images/redo1.png create mode 100644 src/images/redo_1_16.png create mode 100644 src/images/redo_1_24.png create mode 100644 src/images/rightLine.png create mode 100644 src/images/rightLine1.png create mode 100644 src/images/save.png create mode 100644 src/images/save_1_16.png create mode 100644 src/images/save_1_24.png create mode 100644 src/images/save_as_1_16.png create mode 100644 src/images/save_as_1_24.png create mode 100644 src/images/sendToBack.png create mode 100644 src/images/table.png create mode 100644 src/images/table1.png create mode 100644 src/images/text-align-botom.png create mode 100644 src/images/text-align-botom1.png create mode 100644 src/images/text-align-justify.png create mode 100644 src/images/text-align-justify1.png create mode 100644 src/images/text-align-top.png create mode 100644 src/images/text-align-top1.png create mode 100644 src/images/text-align-v-center.png create mode 100644 src/images/text-align-v-center1.png create mode 100644 src/images/text_align_center.png create mode 100644 src/images/text_align_center1.png create mode 100644 src/images/text_align_left.png create mode 100644 src/images/text_align_left1.png create mode 100644 src/images/text_align_right.png create mode 100644 src/images/text_align_right1.png create mode 100644 src/images/text_bold.png create mode 100644 src/images/text_bold1.png create mode 100644 src/images/text_italic.png create mode 100644 src/images/text_italic1.png create mode 100644 src/images/text_underline.png create mode 100644 src/images/text_underline1.png create mode 100644 src/images/toBack.png create mode 100644 src/images/toBottom.png create mode 100644 src/images/toCenter.png create mode 100644 src/images/toFront.png create mode 100644 src/images/toLeft1.png create mode 100644 src/images/toRight.png create mode 100644 src/images/toSameHeight.png create mode 100644 src/images/toSameWidth.png create mode 100644 src/images/toTop.png create mode 100644 src/images/toVCernter.png create mode 100644 src/images/to_bottom.png create mode 100644 src/images/to_bottom_2.png create mode 100644 src/images/to_center.png create mode 100644 src/images/to_center_2.png create mode 100644 src/images/to_h_center.png create mode 100644 src/images/to_h_center_2.png create mode 100644 src/images/to_left.png create mode 100644 src/images/to_left_2.png create mode 100644 src/images/to_right.png create mode 100644 src/images/to_right_2.png create mode 100644 src/images/to_same_height.png create mode 100644 src/images/to_same_height_2.png create mode 100644 src/images/to_same_width.png create mode 100644 src/images/to_same_width_2.png create mode 100644 src/images/to_top.png create mode 100644 src/images/to_top_2.png create mode 100644 src/images/topLine.png create mode 100644 src/images/topLine1.png create mode 100644 src/images/undo.png create mode 100644 src/images/undo1.png create mode 100644 src/images/undo_1_16.png create mode 100644 src/images/undo_1_24.png create mode 100644 src/images/value.png create mode 100644 src/images/var1.png create mode 100644 src/images/variable.png create mode 100644 src/images/variable1.png create mode 100644 src/images/vlayout.png create mode 100644 src/images/zoom-in_1_16.png create mode 100644 src/images/zoom-in_1_24.png create mode 100644 src/images/zoom-in_2_16.png create mode 100644 src/images/zoom-out_1_16.png create mode 100644 src/images/zoom-out_1_24.png create mode 100644 src/images/zoom_in.png create mode 100644 src/images/zoom_in1.png create mode 100644 src/images/zoom_out.png create mode 100644 src/images/zoom_out1.png create mode 100644 src/items/abordertextitem.cpp create mode 100644 src/items/abordertextitem.h create mode 100644 src/items/editors/lrfonteditorwidget.cpp create mode 100644 src/items/editors/lrfonteditorwidget.h create mode 100644 src/items/editors/lritemeditorwidget.cpp create mode 100644 src/items/editors/lritemeditorwidget.h create mode 100644 src/items/editors/lritemsaligneditorwidget.cpp create mode 100644 src/items/editors/lritemsaligneditorwidget.h create mode 100644 src/items/editors/lritemsborderseditorwidget.cpp create mode 100644 src/items/editors/lritemsborderseditorwidget.h create mode 100644 src/items/editors/lrtextalignmenteditorwidget.cpp create mode 100644 src/items/editors/lrtextalignmenteditorwidget.h create mode 100644 src/items/images/Control-Edit Box.png create mode 100644 src/items/images/DataBand.png create mode 100644 src/items/images/DataBand16.png create mode 100644 src/items/images/GroupFooter16.png create mode 100644 src/items/images/GroupHeader16.png create mode 100644 src/items/images/PageFooter.png create mode 100644 src/items/images/PageFooter16.png create mode 100644 src/items/images/PageHeader.png create mode 100644 src/items/images/PageHeader16.png create mode 100644 src/items/images/ReportFooter.png create mode 100644 src/items/images/ReportFooter16.png create mode 100644 src/items/images/ReportHeader.png create mode 100644 src/items/images/ReportHeader16.png create mode 100644 src/items/images/ReportPage.png create mode 100644 src/items/images/ReportPage16.png create mode 100644 src/items/images/SubDetailBand16.png create mode 100644 src/items/images/SubDetailFooterBand16.png create mode 100644 src/items/images/SubDetailHeaderBand16.png create mode 100644 src/items/images/addBand1.png create mode 100644 src/items/images/barcode2.png create mode 100644 src/items/images/hlayout.png create mode 100644 src/items/images/hlayuot_3_24.png create mode 100644 src/items/images/imageItem.png create mode 100644 src/items/images/imageItem1.png create mode 100644 src/items/images/imageItem2.png create mode 100644 src/items/images/insert-text.png create mode 100644 src/items/images/insert-text_1.png create mode 100644 src/items/images/insert-text_2.png create mode 100644 src/items/images/insert-text_3.png create mode 100644 src/items/images/insert-text_5.png create mode 100644 src/items/images/settings.png create mode 100644 src/items/images/settings2.png create mode 100644 src/items/images/shape2.png create mode 100644 src/items/images/shape4.png create mode 100644 src/items/images/shape5.png create mode 100644 src/items/items.qrc create mode 100644 src/items/lralignpropitem.cpp create mode 100644 src/items/lralignpropitem.h create mode 100644 src/items/lrbarcodeitem.cpp create mode 100644 src/items/lrbarcodeitem.h create mode 100644 src/items/lrhorizontallayout.cpp create mode 100644 src/items/lrhorizontallayout.h create mode 100644 src/items/lrimageitem.cpp create mode 100644 src/items/lrimageitem.h create mode 100644 src/items/lrshapeitem.cpp create mode 100644 src/items/lrshapeitem.h create mode 100644 src/items/lrsimpletagparser.cpp create mode 100644 src/items/lrsimpletagparser.h create mode 100644 src/items/lrsubitemparentpropitem.cpp create mode 100644 src/items/lrsubitemparentpropitem.h create mode 100644 src/items/lrtextitem.cpp create mode 100644 src/items/lrtextitem.h create mode 100644 src/items/lrtextitemeditor.cpp create mode 100644 src/items/lrtextitemeditor.h create mode 100644 src/items/lrtextitemeditor.ui create mode 100644 src/lraboutdialog.cpp create mode 100644 src/lraboutdialog.h create mode 100644 src/lraboutdialog.ui create mode 100644 src/lrbanddesignintf.cpp create mode 100644 src/lrbanddesignintf.h create mode 100644 src/lrbandsmanager.cpp create mode 100644 src/lrbandsmanager.h create mode 100644 src/lrbasedesignintf.cpp create mode 100644 src/lrbasedesignintf.h create mode 100644 src/lrcallbackdatasourceintf.h create mode 100644 src/lrcollection.h create mode 100644 src/lrdatadesignintf.cpp create mode 100644 src/lrdatadesignintf.h create mode 100644 src/lrdatasourcemanager.cpp create mode 100644 src/lrdatasourcemanager.h create mode 100644 src/lrdatasourcemanagerintf.h create mode 100644 src/lrdesignelementsfactory.h create mode 100644 src/lrglobal.cpp create mode 100644 src/lrglobal.h create mode 100644 src/lrgroupfunctions.cpp create mode 100644 src/lrgroupfunctions.h create mode 100644 src/lritemdesignintf.cpp create mode 100644 src/lritemdesignintf.h create mode 100644 src/lrpagedesignintf.cpp create mode 100644 src/lrpagedesignintf.h create mode 100644 src/lrpageitemdesignintf.cpp create mode 100644 src/lrpageitemdesignintf.h create mode 100644 src/lrpreviewreportwindow.cpp create mode 100644 src/lrpreviewreportwindow.h create mode 100644 src/lrpreviewreportwindow.ui create mode 100644 src/lrreportdesignwidget.cpp create mode 100644 src/lrreportdesignwidget.h create mode 100644 src/lrreportdesignwindow.cpp create mode 100644 src/lrreportdesignwindow.h create mode 100644 src/lrreportengine.cpp create mode 100644 src/lrreportengine.h create mode 100644 src/lrreportengine_p.h create mode 100644 src/lrreportrender.cpp create mode 100644 src/lrreportrender.h create mode 100644 src/lrscriptenginemanager.cpp create mode 100644 src/lrscriptenginemanager.h create mode 100644 src/lrscriptenginemanagerintf.h create mode 100644 src/lrserializatorsfactory.cpp create mode 100644 src/lrserializatorsfactory.h create mode 100644 src/lrsimplecrypt.cpp create mode 100644 src/lrsimplecrypt.h create mode 100644 src/lrvariablesholder.cpp create mode 100644 src/lrvariablesholder.h create mode 100644 src/objectinspector/editors/lrbuttonlineeditor.cpp create mode 100644 src/objectinspector/editors/lrbuttonlineeditor.h create mode 100644 src/objectinspector/editors/lrcheckboxeditor.cpp create mode 100644 src/objectinspector/editors/lrcheckboxeditor.h create mode 100644 src/objectinspector/editors/lrcoloreditor.cpp create mode 100644 src/objectinspector/editors/lrcoloreditor.h create mode 100644 src/objectinspector/editors/lrcomboboxeditor.cpp create mode 100644 src/objectinspector/editors/lrcomboboxeditor.h create mode 100644 src/objectinspector/editors/lrfonteditor.cpp create mode 100644 src/objectinspector/editors/lrfonteditor.h create mode 100644 src/objectinspector/editors/lrimageeditor.cpp create mode 100644 src/objectinspector/editors/lrimageeditor.h create mode 100644 src/objectinspector/editors/lrtextitempropertyeditor.cpp create mode 100644 src/objectinspector/editors/lrtextitempropertyeditor.h create mode 100644 src/objectinspector/editors/ltextitempropertyeditor.ui create mode 100644 src/objectinspector/images/check.png create mode 100644 src/objectinspector/images/check_w.png create mode 100644 src/objectinspector/images/checked.png create mode 100644 src/objectinspector/images/clear.png create mode 100644 src/objectinspector/images/edit_16.ico create mode 100644 src/objectinspector/images/uncheck.png create mode 100644 src/objectinspector/images/uncheck_w.png create mode 100644 src/objectinspector/images/unchecked.png create mode 100644 src/objectinspector/lobjectinspector.qrc create mode 100644 src/objectinspector/lrbasedesignobjectmodel.cpp create mode 100644 src/objectinspector/lrbasedesignobjectmodel.h create mode 100644 src/objectinspector/lrobjectinspectorwidget.cpp create mode 100644 src/objectinspector/lrobjectinspectorwidget.h create mode 100644 src/objectinspector/lrobjectitemmodel.cpp create mode 100644 src/objectinspector/lrobjectitemmodel.h create mode 100644 src/objectinspector/lrobjectpropitem.cpp create mode 100644 src/objectinspector/lrobjectpropitem.h create mode 100644 src/objectinspector/lrpropertydelegate.cpp create mode 100644 src/objectinspector/lrpropertydelegate.h create mode 100644 src/objectinspector/propertyItems/lrboolpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrboolpropitem.h create mode 100644 src/objectinspector/propertyItems/lrcolorpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrcolorpropitem.h create mode 100644 src/objectinspector/propertyItems/lrdatasourcepropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrdatasourcepropitem.h create mode 100644 src/objectinspector/propertyItems/lrenumpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrenumpropitem.h create mode 100644 src/objectinspector/propertyItems/lrflagspropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrflagspropitem.h create mode 100644 src/objectinspector/propertyItems/lrfontpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrfontpropitem.h create mode 100644 src/objectinspector/propertyItems/lrgroupfieldpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrgroupfieldpropitem.h create mode 100644 src/objectinspector/propertyItems/lrimagepropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrimagepropitem.h create mode 100644 src/objectinspector/propertyItems/lrintpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrintpropitem.h create mode 100644 src/objectinspector/propertyItems/lrqrealpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrqrealpropitem.h create mode 100644 src/objectinspector/propertyItems/lrrectproptem.cpp create mode 100644 src/objectinspector/propertyItems/lrrectproptem.h create mode 100644 src/objectinspector/propertyItems/lrstringpropitem.cpp create mode 100644 src/objectinspector/propertyItems/lrstringpropitem.h create mode 100644 src/objectsbrowser/lrobjectbrowser.cpp create mode 100644 src/objectsbrowser/lrobjectbrowser.h create mode 100644 src/report.qrc create mode 100644 src/serializators/aserializatorintf.cpp create mode 100644 src/serializators/astorageintf.cpp create mode 100644 src/serializators/lrserializatorintf.h create mode 100644 src/serializators/lrstorageintf.h create mode 100644 src/serializators/lrxmlbasetypesserializators.cpp create mode 100644 src/serializators/lrxmlbasetypesserializators.h create mode 100644 src/serializators/lrxmlqrectserializator.cpp create mode 100644 src/serializators/lrxmlqrectserializator.h create mode 100644 src/serializators/lrxmlreader.cpp create mode 100644 src/serializators/lrxmlreader.h create mode 100644 src/serializators/lrxmlserializatorsfactory.h create mode 100644 src/serializators/lrxmlwriter.cpp create mode 100644 src/serializators/lrxmlwriter.h create mode 100644 src/waitform.cpp create mode 100644 src/waitform.h create mode 100644 src/waitform.ui diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index a48c426..1227378 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # LimeReport ##How to use it -* Build limereport.pro. It will create a limereport shared library -* In your project connect the limereport library then in source code add: +1. Build limereport.pro. It will create a limereport shared library +2. In your project connect the limereport library then in source code add: ```C #include "lrreportengine.h" to add report engine @@ -15,4 +15,4 @@ report->printReport(); to print report ``` -For more samples see a demo\r1 \ No newline at end of file +For more samples see a demo \ No newline at end of file diff --git a/demo/r1/demo_reports/categories.lrxml b/demo/r1/demo_reports/categories.lrxml new file mode 100644 index 0000000..165a91e --- /dev/null +++ b/demo/r1/demo_reports/categories.lrxml @@ -0,0 +1,170 @@ + + + + + + page1 + + + + + + + + ReportPage1 + + + + DataBand1 + + + + ImageItem1 + + + + + DataBand1 + + + + + + category + Picture + + + + + + ReportPage1 + + + + + + + category + + + + + + + SubDetailBand1 + + + + TextItem1 + + + + + SubDetailBand1 + + + $D{products.ProductName} + + + + + + + + + + + + + + + TextItem2 + + + + + SubDetailBand1 + + + $D{products.UnitPrice} + + + + + + + + + + + + + + + + + ReportPage1 + + + + DataBand1 + + + products + + + + + + + + + + + + + + + + + datasources + + + + northwind + QSQLITE + ./demo_reports/northwind.db + + + + + + + + + + category + Select * from categories + northwind + + + + + + products + Select * from products where CategoryID = $D{category.CategoryID} + northwind + category + + + + + + + TestName + TestValue + + + + + diff --git a/demo/r1/demo_reports/demoReport1_report_header_group_subdetail.lrxml b/demo/r1/demo_reports/demoReport1_report_header_group_subdetail.lrxml new file mode 100644 index 0000000..e036b0e --- /dev/null +++ b/demo/r1/demo_reports/demoReport1_report_header_group_subdetail.lrxml @@ -0,0 +1,632 @@ + + + + + + page1 + + + + + + + + ReportPage1 + + + + ReportHeader1 + + + + TextItem1 + + + + + ReportHeader1 + + + Lime +Report + + + + + + + + + + + + + + + ImageItem1 + + + + + ReportHeader1 + + + 89504e470d0a1a0a0000000d494844520000006400000071080600000023f9067c000000097048597300000dd700000dd70142289b780000119c49444154789ced9d79701cd59dc73feff55cba46b7c18eed8d84c1b6c02c4636b58ea928d8c609b0bb64c3429104ca5420b001c292cd3ae50d7120091bbb300e570a0c2609391c0889b99c1828b0036c42488c8d8d1cf9968c25d91aeb1849a3397afa78fb47cf48e383b2248f3c9a91be5553d3d3afbbe7757ffbbddfeffd8ef704a780dfef07104208745d17a73a7e1c83871002c330304d13c00638e503deb871a36bf1e2c5771886e1374d5328a546ba9e630642086f2010f8d3b469d35ec7e1c2729deaa44020e002beee72b9ced6340da5d4782b49135c2e577e28145a0b6c077a80e82909e9eaea12b66d8b6834aaaf5cb9f2059fcf67bb5c2e4388715e868b4824622e58b060e6a5975eba2810084c00a602fb180421a2b7b7570098a669ad58b1621b70180802d688d63ab711abadadfdbc94b2ce344d17e00524c0295b4812524a05f402078056c0601032681c274001d1d9b367cf9152da899e46e13c4b31684212308128104e6c8f6378b04b4b4b63272b182a2149a894cf38860129e5c9f79fe17a8ce31418276494619c905186e1ca9013a094e2b8b1c9b806360c199b36428410ac59b3068fc7a3b5b5b5b9bababa4428143a9ea49c47d23ed5d8d8686fdebcd92461a31a2cd24608c0c2850b7d555555cb84105f554a598ccd56226ddb8eb6b4b43c595d5dfd108e5818f41021ad843cf0c003f1bababab57bf6ec79aba9a9a9c2300c4f3aaf9f0d104208cbb2ac8f3efa28004c04dac904215eaf97b56bd7aab56bd776242a509cb8fe586b25c9f1591c88e0989804839427692344d7f56465e240178ef5722c43e190613104e19e36426ebdf5569e7aeaa964454cc64d2b082150437420a58d90a79e7a0aa514efbfff3eab57af1e6bddd431b02c8bbd7bf7aa1d3b760cf9dcb40af59e9e1e317dfaf4090f3ffc70795f5f9fb42c6b4c12a394b21b1b1b3bafbcf2ca761cb5f7cc7759008140c05b5555f5359fcf779bdfef5763d1bb2884909665450dc3580bfc08a7eb36067b7eda0859b06001d3a74fd78195c033c0598087b1a76541c2e721a5acb46d3b309413d346c8e6cd9b939b16d08df356b8187b26faa48a6bd8b6ddc710959bb476590c6858a1c4672cb68e54d864ca7492625c5443ad44aec2e7f3118b9dd431f8b148ab71f1b5d75ea3a4a4c4130c06dddddddda2afaf6fccb590847151eddab5cb7cf4d147e389dd99d1b2ce39e79c7ee3a26ddb63dab8d8dadafae4a38f3efa50625f668c8bf7dd775fbcaeae6ecdae5dbbde3874e85085aeeb1e31d6ecef806ddb564b4b4b07703699322e161414b06edd3ab56eddba2e1c197214d0d275fd2c4252cbd2851091841b62d0481b21e1709844450c9c40ba1ec6669705098baf52ca66880185692364f7eeddcc98312359199381e0afb186fefbcecfcf27128964c6b83863c60c945284c361d78e1d3bdcb66dd3d1d131e644881002d33469686830972f5f9e941d99d1b2745d777b3c9e2f5e72c9255799a6698f455b168e96a55f78e1851b962f5fbe9e449ac1604f4e2b211b366c50b5b5b507dadbdbff1608048ae2f1b89b2178cb720022d1428cfafa7a1ba8648881e9692364e6cc995c7bedb516b0056804ca0177baae9f6550802ea554b66d674686ecdab52b591113c7853bd66d59966ddb0619362e82330689e3a8bf63a5ab3a1ec96e3a738172c761ac47c60ffbdec7637b4719c60919651895849c247226db9403c731348c14f2919221a7052104adadad1228080402aeaeae2e2984c80a992484108661a88686065d08116588f274541202e0f7fb27e4e7e7ff72c284093312ba7c56b49244d449a4babafac96f7ce31b8f3030141814462d21f7dd775fd7942953beb67dfbf6a99d9d9d2596656585295f08816559768a3fe428d94ec8d2a54b59b56a958993131f05f271e45d56b4129cb19821840867cc1f924eac5ab50a9c9b8ae1bc6182ec21230995202373093b23802185618e420cb9eea352edede93926934165eb2767d4dee2e26294526cd9b2456cd8b0411ac6a04363338e8450a7bebe5e2554f5cc587bd38d7038ecaea9a939b7aaaaaa3012896493fc10b66d5b4d4d4d6dafbefaea61ce60f4fb097fb264c9127efef39f9fc62507609a66797e7efe8352ca595eaf17b247a80bdbb663c160f027c0c33856ef918d7eafacaca4a1a1a1f0e8d1a3de482422a2d1a8d075ddb8fcf2cbfb18620ad7c9b06cd9324a4a4a8e02d700938032b22b705b0171b7db5d6e18c6d1a19c382c42962d5be6292d2d5d5b565676594272d9e170f843e0cb38898e3aa7f1f056ae5c090331c2dd89eb659b2bd8300c23c299705099a629955213344d3b0b48469b848099c01e1c07d5e93ebc64026932c62b9bc848be3c4356db874548381c3e7e324c158bc5bc38ddcb41d2d7df67f33450c3aaf3b0083959ac956ddb9263f3d2d3d9c5642321c3c2a81c188e658c1332ca907142dc19afc1e8c219893ab9f762b4da4a64811b615a1034503fdc86f56117b691620bfde3bfc0c2dfc3d042cb720be924a49f849716e3bdb01caf5be2366c8a8a3d7c420a2a04e4d90a6528621797d3da1aa1cd52e85183d89fdb885eb681380965604609ecee4e63edb204e9214408a46dca7228bc773ee72d9acc055e8d85122e9282a9273b65820fa6158361531f3579775a31af4d29e2fd8e183df7be4f647777d69bde8785d327c48c23224151d9f466d95faee1bfce2d67e6604f15804732cbe36156b187dbaafd341f8ef0649ec66fdf0d70f8a583843501961a3bc40c8b903e7c0acb8058103e781136de4f61a0a5e0dc0a669ecea3f348a67cb290fbefba80db3f33891fe8162fbfda4c72fead3141ca500951000b8ffcc6cf960945bcf1001cdae34ca0e1e1844766296c4b61db0a4b2994022500211002a426909ac475fc30d3ab31694e254f3c5dc7e2a5efb1fcd7fb69c4b167e57cfefb500991f75ccc9485d6f65bdcbfbc792e0a671af914580a3b6e61e8367a632f47767773784f0f6d2d7d043b6284f35c70561ebe73fd949d5fc6e4e9c55495fba870493c9a18a88f0026e5f36f3f9ecf3fe4bbb8f3e9ddd4e3182e739a945313229cf80261c5e51dd3a8f9ce6c7ee4d198e894258e51604b4df5e956744f0fcdcfede783c71bd819b368c3310c8670e68bd719485e71013ea0e8a6f39875fbf95c3eab8c4bbc927c2106c647255e2e5e71098fb784f9da6bcdd47b35a2ba95bba47c2c21791a442de8a140a18744c18edff91fa9e3db9a9692eaac004d424105ed65b37aae7a70d3b35b8334006d4000e8c021248663b94d9dfb2369fbf23eb397bf3fb397376e3a8fb9df9bc36d930b982585f33f0228f372e1e397f2fdea67f9ba6e71c82389c67394928f1d27479df7585dd3fc44a1f6c62abf6bdd1d9e63c800c82b82e90b50776f523d37fc2ab4354883807ae03d9c55630ee01013c46921111c726289ed10d029042dc0ee67f6f2d2dc17b9635b07eb554ad72405727201f35ff92cb70065713b7733b34e2024d5aa1eb811ff25a2f1dbf20f2bca8f6f4b76e104c5d5f7c3dd6fc0e40bd08c3e05f42868c621a10fa755243d8827d39214602b852520ecd1683f1ae5c36bdfe47b1f74f08bd403dd92fc4bcfe6ba697e2e000a4f56f75cc03137a5be95101940eb0d1496f9f88e4772776abbb015ea48dc133cfa8535dd2cb82b71627fe86dd27f3cd4d5779402e21696df4de4608803dfdfca836d11de4af5ace4bba87c643ed703a5621407689c0efa09e9b909c403cef681ebc99b90c77fba044b530fb614f6fe5e5a17bfee59d75531abfd24d74bfa4086eda0ea359c94b8973fe2c0abcdacb0ed810001af46de45657c0a98a29cf0d26c097c18342440e3f550fc8cb3a3fd465c530ab9c125b83ff54025a4aaefe4e0dc17f84553c4b3bdd45fd03782f55240ac3bcedfdb63fcb67faf80420f155f9ac66c72b4db9200d5cf393f1e9c8328f430df2d5973ec511a91c973f58b5fe0b95e83bf9f555eb2c3eff78747ba72af7c446720ca2bfd3b14b804de4f4fe47cc04f0ea65d1ff386dd7201555e8d678fd92f04d6d4b976f8a6e7a2ca11d6fb6a6a6a9add6ef7888713be759858b74e8352031a9726707fa280b3812272508ef43ff8835fa2a0c8cd1382c4a02f8180eeea0e7ee99988f015291ccda9bba6a62636d273987812352bf512b31447fa2b2c90856efc3832243709d9f4cfb826e673b3142c4e2dec3388def5176da3955fa14bd11f9663e7e7e78fb8a12f39f0f3695808e2294502671e2e37d995333228c8b995f08fe54c724b7e985a60d8988fede4ede79bb46d3e8fcb48040e9b30bc64c6e122cf8526a134f9db56d8e178ff1a8a39450680acef4274c570f519fc9f61130147c5792fc0be6f6f6153698167afdbed8e4b29873ce5693a90a7512a0525c9df96c26a8dd08333d6c939038a8c5970de6f38e4ff194bde3ec29a884947678c8eeb37f112d0545c5cbc4fd3b4e440ef8cbe910dd7915fe0667eff0ee1b4dcad1d1ce1582b40ce2019c06c037d97ff8187be3283f74b3cd41c8e500fecaeaeaeeef8b84510471a93f229714bae4edd173589bdd8c4411cdb58b2ebca1952925a8a8d935c19f8e96e5e07b624eef2e8f9e79f7f467ddbea1e10ff0bcf2f427a24b334415db2ccb4b0f7f570b83dc61101bd2a073d89a96aa3c279e3ba8170e22ecdcaca4aef89a78d0c9abee89001f0d9c94cf46afc777fa180b049f48583ec0082ca592839e756ac3e991e6fe338920084659d997b5ebf18aa9e75b68fde88cfe7e26a2958942c570a5ac31c7db89ead3899b97de4a250cf7405001efb147ce133cef6772f42f83dccf7481e4c3da6374ef8a77b780f382c1c07987ec2857200191fe96ebe0a2efb0a886b9cdfff53cb451ec9e3405ef2184b616fefa471f587bc0bb42867c6ba9cebae20c3841cb81ece790ef883f33b7233177a246b85e0bcd4e39afb68bff3cfbc0e1cc27180252775c939648c90e012284de487beb808f9d9a9d47a258f4b416dea711d317a57ed60d3ce2e3e948203b6a2931c5e012e2384bc77f500192d5fc65deea3ce2bf989382eecb4374ee4378dfcf5f106de96827db6a2951c951d496484907f7ad9f90e2ec15be0e6f36ec9d3380ea77ef4c689ac6f62cb9d7fe26501fb6c45234e5044ce6956a9c8a896a5e02c4df018c79111b731df6c65e757dee645609f721249735690a722a3843cbd9b8e8321965bea5899a09c94858826e800f625be739e0cc82021f7d6c2b7fe4aecfa4dbcb4a79b27535526af86fbdfab98f7bbcb9907484b41d919b31764161923e47b5ba1cc8bdad24ed757dfe1a1963e7e9f5aae09bc574d65c9cfeaf857a0b44b47cb73e59effe37864b4cbead2513e17e6bb015a96fd8de55d3a5b53cbdd92c2ebce61d9f7e7b008288e9ae3848c3862a6e31afef57ef63e5ccfd2b0c947a9e5f92e26fc470df7947999468ec662a522e38424a080d80fb6b1f5b9fd2cd52d82c9c71e36d11b82f49678f82403b158394b4ada08494e4283f37087e3c9b381de5bde61d3a666be6b9a447b747a9fdfcf9f3eb3815f3586083010a6aa12ff99aeea8f1aa46d60a8699a3671e2c4e22baeb8a2fcf6db6f374a4b4b6ddb1eda184e0ac1ae964ef9c10b4fbc531cfae3d3cda1f8d45bf7f9dfa9ad2d6a9f397346f7e73ef739dfecd9b32bdd6eb77df0e0c1981022428ed9b4d24288104254545414af5fbffebaaaaaaa3abfdf1f95520eeb414d9c34894fd7fe58b6f7463cdece4eb14dc517959496868a8b8bfbdc6eb795b23cf66660238e5d2b67c628696b2145454545f3e6cd5b98b6eb1516503da9f2a4658661d8dddddd79c0361c67558c1c6929a345a80f099665c50f1f3e5c8a331d949b1c2103864948228c3463537f0b215c96657971727f732a606e585d56281452baae1f8c46a3d5baaebb1273659d11082144341a8d0583c120391e753268ac5ebd5a5fbd7af5ddc00ca00a279bf64cc2064252ca1edbb6738a94614d1c80f34022c07ee00867befb528069db762f39e6b01aae9625185884385373f62413496db24f86a88f1ba39d9290840017524af737bff9cd0be6cd9be79b3367ceb9050505166476b42c84c8bad1ba10826834aa0b216a841027f42ca724c4344d9452bacbe572af58b1e21edbb693339266db5b396a5058580810370c43eaba6e92129f7c4a429a9b9bed8e8e8e8d6d6d6de78442a1024065cb7a50a31cc2e5727976eedcd9c4406ac5a05673d670a698a9022ac8d2c1e42886e976bb038661b400d1c11022189828c633a2551b9b48ae241407aca1ca81f1d6917e1c33edc8ff0311504d2a89d602380000000049454e44ae426082 + + + + + + + + ShapeItem1 + + + + + ReportHeader1 + + + + + + + + + + + + ShapeItem2 + + + + + ReportHeader1 + + + + + + + + + + + + TextItem9 + + + + + ReportHeader1 + + + REPORT + + + + + + + + + + + + + + + TextItem10 + + + + + ReportHeader1 + + + HEADER + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + + DataBand1 + + + + TextItem3 + + + + + DataBand1 + + + $D{orders.OrderDate} + + + + + + + + + + + + + + + TextItem4 + + + + + DataBand1 + + + $D{orders.OrderID} + + + + + + + + + + + + + + + TextItem12 + + + + + DataBand1 + + + DATA BAND + + + + + + + + + + + + + + + TextItem16 + + + + + DataBand1 + + + OrderID + + + + + + + + + + + + + + + TextItem17 + + + + + DataBand1 + + + Order Date + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + orders + + + + + + + GroupBandHeader1 + + + + TextItem2 + + + + + GroupBandHeader1 + + + $D{orders.CompanyName} + + + + + + + + + + + + + + + ShapeItem3 + + + + + GroupBandHeader1 + + + + + + + + + + + + TextItem11 + + + + + GroupBandHeader1 + + + GROUP HEADER + + + + + + + + + + + + + + + + + ReportPage1 + + + + DataBand1 + + + CompanyName + + + + + SubDetailBand1 + + + + TextItem5 + + + + + SubDetailBand1 + + + $D{orderitems.ProductName} + + + + + + + + + + + + + + + TextItem6 + + + + + SubDetailBand1 + + + $D{orderitems.Quantity} + + + + + + + + + + + + + + + TextItem7 + + + + + SubDetailBand1 + + + $S{line("SubDetailBand1")} + + + + + + + + + + + + + + + TextItem13 + + + + + SubDetailBand1 + + + SUBDETAIL BAND + + + + + + + + + + + + + + + + + ReportPage1 + + + + DataBand1 + + + orderitems + + + + SubDetailFooterBand1 + + + + TextItem8 + + + + + SubDetailFooterBand1 + + + $S{SUM($D{orderitems.Quantity},"SubDetailBand1")} + + + + + + + + + + + + + + + TextItem14 + + + + + SubDetailFooterBand1 + + + SUBDETAIL FOOTER + + + + + + + + + + + + + + + TextItem15 + + + + + SubDetailFooterBand1 + + + Total + + + + + + + + + + + + + + + ShapeItem4 + + + + + SubDetailFooterBand1 + + + + + + + + + + + + + + ReportPage1 + + + + SubDetailBand1 + + + + + + + + + + + + + + + + + + + datasources + + + + northwind + QSQLITE + ./demo_reports/northwind.db + + + + + + + + + + orders + Select * from orders +inner join customers on customers.customerid = orders.customerid order by companyname +limit 50 + northwind + + + + + + orderitems + Select * from orderitems + inner join products on products.productid = orderitems.productid +where orderid = $D{orders.orderid} + northwind + orders + + + + + + + diff --git a/demo/r1/demo_reports/northwind.db b/demo/r1/demo_reports/northwind.db new file mode 100644 index 0000000000000000000000000000000000000000..42a4ef6df97df487dd5ba977b839db5e50ab5192 GIT binary patch literal 925696 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

}F}vw)qbm=H!FjeM94escG=JY=IjTDmz}+ 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�Z-cd&EXk9%Ud58Vsl?F|6B1WSp#5#I@xC-T-=pZF-EMFjg}ZM= zo89Qa-5Ncoi7gs6bmEN~KE6inS}9_lr%}gqXw;uZQU4iX=m;;`^G07bmV9_djlN4| z={AJfDRHC(-m*sXLo8YF*AL%rO_#V>;$ei{EP)Qb(Z(m$=-^MH(ZRt7jn3ENf|@GD zhD}TNCFapR=|hZi{^0+K#w@xDfe*wLNhMQsT0IYy7WLQ8nz1kqi+tt5j41d!sA> z9ULZ9Dk`77-eQS>Po<)Q?DfJN7^^y=Qc*qZ^+1n^-Bl_onY{*60zuG-sVHdQC}6LZ ziT~do3kZm;GEt1Zn&CoP zX+mY9ve_#zSr6=@GEuqgmBwbs)lH~OR2O?C!xgqeWuiEH8CsEG3zdm#U@yBx;__7{ zYM8y$kp%tSCR8R$V=uK;!YI-Sm5FL*FHLbo?5;9VN$jQ6sysNT%0&6tOW0LsLS>?w z*^70FBC1xIs6_T+t+Nb{p)ygh1tcQj7%CIxuoq>#t1?kp>;;&J54KR5s516Kb1`HD zCsZaXmp$KHEE1wB6V=9^XAXy5R3@s6J&)~w6WdZ~TEd>2A{GRh*oK5o_8j&HotRHT zFMAfd>P&1+LK%Cuu^E~_C$=IXi9Ksq!#ISAc_ehPXUfyWLANBKjy>bcfJU^5El6l* zPY)-H6!KgW3fa@`X(DFcoCK3S-I^_)%Vs1ru%|j(ZP;ZF32p4DU>&sFPRu5unLP!+ zG1z5O5^C6!#l<3a--Lu>_9V7KPs}1Ai9Inj5vHA*m`Or6djbZoz%DaL7-dg*Glhkk zPC_Gl9Qs4SE@K;ac^v!yO^lMz$sX6!#E))-gckPLOqdVx-}(0+R!)?&@9Pr55QLQz ztz+MfmcsRfl@sk{-*uHj_qMQdqRH$#!-e}AR!-E*zSYy9fitX}Xe0Xudg6NhVdX?S z**CQg{QZZO6K!YTl!>lsVdX?~**E#MaFfEyiPp2Pn=G)|VdX@}*w^6iU<>6$E%p^= zz{ARkR6&w$@*SUJ%O_W7(Nn5iJF zoT!(54vn?2g>s@b?6a8xaQ9*5M5nUPVE#|oMLE%a_L(V~$ivEs2H2-f7QD;C%88b+ zPoaq%c2Q1LW1sr7V3>VaIniGB3499(%89nIj~koe&poW1=v4MG&i@-$PPCkT1o>|G z7Ue|K*+)f*@S+YYCz`=NN=X$DN;y$4`>-KJJeO4ZX=bwzp*tw-l0t%?eW(S%Gl!E& zNMRp9KV*2eeiBC52hgbyj*+x+mk+7~&{PplBq5u9fD@#K6G$j$?{~I}Gj&O5V(+(A zf>jSYBxvk?%&CNJ5^VNfLI%7;!WIdB_8#`_44WjRvv*s;Irzgq61?nP7|R5^cuCOM zyEsEY*dQUBz0;j94yu!o%-+GNti#}JaX`=jdmAzYaQPk*O!n3c3wk?GtRta^y){kr zAelIjgnafE43L6X##$0I_LiO|-pdD&z}cHM(4+RR`2W8V|G#SOiE-4c)?UQDk*`_% z5LXcQC9XuiZtX{0Mcg0xhP9fw2KlCS0P-zsE%89&I^sddx2=Pb?^uTr4@JIf9Y#Ey zcm(o2>qz2J$oH+IiN_F+MSft76GOxaVi@_M6(L56G2}{E(Xst4MSzw}W+%;0&usw42*`K?v5uDiTfPc8(tmL0Cni)42r`@qnNr z(OPa|55cgCL>o8^ID`CdSVf{k+{_hu)v$_0>$$J51Y+i}ibOlPucuy|hl)hoxv#So z!u_y{L^bX!^^1yFMWXH83nLZa7%CDS=3bnvIjkblG43rFLzlxU63yn`Ko10-VHJro zZh$d?W2i{9j2rD~kgE=>NHm=r7@3DvBs$8CDWW%9SVf|}9M(gFDj~cv66M--SJXr* z61BNj>xj@rMWQ&CU4}@|*{=|}!7kHCNN2zLvqYdaNJ2aN1sl=B10*D~ zUpiYw{ohZ5kNwgnCVLO}k>F)N!=NJgmR=GH*w57g@hv?hjIp1yoEq4rn}kI66EtqX zUGE~Hj{Vddgvrgrog`$jpO~1sHrzqN6!sH#83?y;6n-2khhbRZHWGT+k3IF`7_B7q zvLCsa4l3M2LKpin$rM3nGYN%k!)U1m$7mv$2&(T22{+UDAPZ3pPjvs_!LtIJ@`QVaD7~l=_lx?>F2_l zqF3uT>38Z6=#T5q!92t7=pXA}=^G4>@h4XZg4KbZGF~*^Fy1#lHNG}B{Noy40;=ilJ=R+R6fFaMxvh)c;!&LW>hUx4f4V!F+w6Eo7 zc#T7PK9+RM)(;u7WE_H`fo%mt#w)UfEdWE_L@arakT?qAOOQyG*i=G(t*K$jES13D z$dGvzmaKXS`3*Kcry(2f#*lp`#A<{)qCS0bVl00^b!;KD2_D zz<^NAA5lKEh{GBZP{~G=4^8I9Rbnc?i1ML*yjXPRN{*lp1=nQoBItJpm03g?(PCay zB*qj(lo9pvLa25?P)0PJ7fg2{>kv^!)aC^^LO7y~Xd5qRv7pL~Y&4=ge^wIM?uas? z4$mJ>hCn5vjA#kZgES;;p^RuV&%=yRL>bX0o(oGez%I&&rt=)=Ll1&7qKs!ZHm~yf zBg%+Y@a$SA56)B>(JY?LMc;;qGNO4ryC@Mts)#b8ZC9 zgJ%wiMTR2Eh$ivOqD1JrA5lg$pJ&Xl;H4ZwTEx>vGDPsVhH9o79>5M0;ngJc@>Cey2i4vFB&2d!mq^4E zt4OeTYLiIIhW8_(m8UWcc2<&5%~PObA{=9160$igR0NIc;T0t4JOwRtcpnmKcuJ;7 z5Qg_AVJc7Nez+guy+}yqe(Yir-jjqx?uS8_a30G^=!G59L~3Ul33)uJKV!C*9A1io zuH|r8hRAaW?6U`L(#{iQYHN2ADtH2RXXvtA&+NPLO-GSakOA-+m{4QW}gBW>#q;+w>`kdE~>@g1aV zy-R$L_&)IiWPocU^`keR$@k?Z~^%XM3`kMF+@mu0|$W-fl z;t#|P#2=9X>nCKI^)oWv`i1x_GQ;{!()JKFWTveXA=HHDm}Ps3K4i9S65*`}pJ&@P z(Lv_eE;83nK<3$r#3W?C?I$K93+xnPDlvd8w9}A9b~-TwS!`z#vxwQq5<7>Oi!8PC zi21|vQz2^o6i;$WncUzD7R;;)sZT{J-1*Tx;C? zPp<|bVxU$ZhNi7P9O}{P`y54+Nz_QxN$e`|u!P*wD#Mb6{Zd-(`B<_~LO60i=R#S+ zK&{o4JHYyD;@e#eL|fgHMO4<7g#T`a|6(-V=D~g2JQ(Y>X&8RCX|u(?ZQ5#tj#i^h zpCe1yPo~YlFKaXIN70LJq0PHemR>;kY9*FS94R5c$oC$WOzh3lX3DQMkCh@0pJ_9H z!jgs8(PqhSw=no`vyR8l>=cPH3Au^At1Mv;lr{(B@izAa6y1v@P65*|oz-Q6!eNmQvMEEd(Z})8?OL#xqedo&3 z9SAc~LT+L;W6A23*g^uIQM-k=yxn?Uit>xBPq1W9k&q{7W6zv+XFC*~H4^v$+MV-c z={1BKkT^%;KJm-wD8qld@!z@PgAUJO5_nTOJm^3=G`#H{+Ee(Mj^mU%bh(L+*Vv&y zD*pa=)ABrj!1-UMT?=dd+)cB7zNWpaeWHD>{RnHM*m|;_sTb(wdQflB+x0$uMBfBf z3fflRN#9N13w*;m{Rlmz$Muu-v-At~EA;F2+w^;3Wud3_m-ILF|GiOvf3r^i52Cnj z!y1~iVGVNw!`i-5#12-&I{uP}4GTqMSRyQe-fq~7u5;MC2Z}zg#LW`7BFrR-4vEtw z(2)*XxmdD_C3cf|4&iJjvAM)O2sbD(E`A&%hA519o|bqQq4^~6hc%+%?`K5ABadk4 zv_~}j365y^cRr$TjXUW0njF#b7d)chB*kYXK13LJnj=PqEOkrFlh|A0QVG2D5#v)V zdGQX6c<}~~c;)wb50;;uA#sPq0|=iywC`&ynfPo*%mZa!*Gr%aAF+Pm-IiZu<6rNHQ;nZFT@u$K+y;pOiJc|nx4V`G3cq2#k@8oB4KVv&AdHoV{ zckgOhdO`w!L!;hzrT<^;F+Mk5GafZ=F)oJHwvRSe8B2^UVXo~aSe+Yk#QGPog7;(k zt&pobSwBYKU*AQa2U)#l_)AaIb?r;&5&SsJ1bivX4ScM&8hR0LrH#M{;tI$p8lJB_ zZ+f2a-0r!|bBgC!&uaBo=8vdEbOUec&k$~2C8Be9itfyzX4 z-i&KeMN}qwh&MrRAMmCs6K(LO{95RW5mA}wHs0hGm4lsCndks-gylYA7nO-F=Z!gj z;pSB)x`j8UIgmAts7!PLhxM#{;KWrXx{x=tW_Q6cR3@7725cgas7!PTZz#-x$!j7i z6P?QIVR{?*7L|zx0hif~s7&-!KD7mXw#r1;^Qn!^;__7{I+ahwWk(|_6Wz_HV9q?U zF%!+FfN6wXR3>_mPf0RGRzYQ=3wYgVsW_<0L^tueo_gW;RVG^JwFwzwmyMZdUNck< z%^wk!iEiXIeI+7gqB7Bayar~(frF|{G~=+|6*OH$R3jM1AzslN6sfB+67qRPnOKK3QcA*fUJ>Ylc9}>C301rt=XQ$}laRv8(;Vpj5Gf*| zmzT+3P$3DqybL?PL<&e4;ib?+0KPV#gf3o+{X-&oBsB3-ySfnb|2u2_9_>HQ@;wTF z%YS?2uYWqmhjjz`AVa44H|V$jkv{*h`oO0Dg1P?HOXput@j5MY zUl%BKv3e?Z@fBU}VhvX2?tq`!=OY{p)=Ql&WodhfuMngxu1Ll}(vXZs}{q&wLmjl=&XPl36K% z@pzeq^>mqqmr!Osg`e3q5?BM3*=uD9>*+G*cq}=$NZc#2L0n~d0sgx{Nadb`B(Nec z_nat8pGjavSFV*|NyD1BTtj0~u4CO>uH%8rjk9nQFW#JTZ;LFQEP;2k+^5RMa*EwS>?C#}r`p}b9%3)D-tHszBOB}i;vjJvaR}LH4--d-qsS(E zj5wV*1KDiPB+f#%*qabHCC)~++H;U?_GZM*k?rvl4AhONhA5qnV(-p~YKW@kBhWwy0ikM$ z%HeX=t%z!fYUCsGJXAwe9v_iWw`z#;^5NlR5f7_|s7yZGQ!m0!)eu$AhZ>v37OEjC zpAX?2@)6Y#)ybzpcOckBHAMCCLF|PbkquFrR>=p05MTQvsvRno56E~}wL?|&f#PCe z2UI&$BJc01hh9h#)ehCh`(fTzBRPWYQ1GNuct1QT=YXj6!MN7 zG3{t%3lcIp%qT0K%v=&0d3%#39>nG(@+i^b_o~SaS4IGxLfU)aQWkd(~cCbh^98?+6Am27qEL9g( zMzn!%)7T6RzENdF)A{`2WN0*wDkIAH{Ar2M@Elb}w42Wl*1@xiDkIv*=VRk_R2k83 zzBRr8qRNOC^Q}8uVWdt}8PRsWHTKktDkJLht+4}mR2k7Mz7;I*0NE$>+hG0WQzA~ced&xM8A;ly%CDB^Q7Gn(MUvPtORo8$P1Xch^Hd~?X;z!sS#`ev3!l?m4BhUcX(SZzIYo)^E{_IC@bNiTA^ep^Q%M-(v-?V5 zrru}@2_qa<*+_w7B$H6XXXp6EgYuKmz-No(razjraf?lZb&fYVnkWQ#+ZFRo;cW-6 zu4n>n;^&)|1t7T*bxG*qo2EICmx($gH1JKPiIH1Tn}iC!2@dyqFH=bn0N+uQIY5f-xa3&hh0=8+Rb-0#HtHX z6^S1Q7xmPO*ku+8EqqaG zl?V}Ll2F4JVFEllg9MZB1oK0|nNBBRi0{-crs|K5kF-qkIR$t%ofJNJ!+{J3Bx- zM6{oTTE4w6Lp+8)5=QvKk&IT;AMGWffG_MSg&CxyJtSy+VXadR7uQWf3SU@}3$0Mm zE)sOU5XMx)w{((_$royY+3+nLBqZ_$(_K0L|K6TYJaYD5&)1$$UFo|eU=0!X*2cLWeLAIQ~w1^2Iht{ zjpMN7CCEeja#8eMA#t6=^AdRCnZ7S&={tm(Dp4X^sQGVsi^jGa(4)=A*)%kpB6g)HwX6up>y&+_5f zW%;U5^x@sl^5GR{`977R+}*^>$uhAGBg@1Glx1PsJ!}S;7{EZ0{Rb^7To~kXVZ_&qi3Kvi@K5NAiDvzWra+ z|7$kJ+WwfbqUrpISxHdM#*`JE%8!6lobHb)D+&UxL={t3G?^bhD+y9hF=a(N_~H1n zjwve|;D={>;T0HDR6R@CH&)Tcuw8dFx3^Fz2F!j71-qBZ>BF|h(zg+8&g&^pRcP9KsGC;tY{TK zFntcxRWW5nExr~L05P07rW6Fuzd^L{lh$$y(^8NE`p+<~(scI_X`)7!`9byIv z8eatqHNnHyNnm^xPSqRJNC@&(ILadCA)$n?YRwig#5xjE_?elEWR(~gPQH7-2RC8 zF>+7)6XK`Hz3k73pCk9SzaV}|{0g~`{WWrh{SEP3;&;e>?eB>{5H}EiM6R@dBL0lr z&;Et@EAcnvD#t_Ah&s_g?(cYsKICf0M6PixqD^#=2RJS<0lC&mBqkvbbo|J5PBJlt zn2J2e2@unW>Bxhf4CEnBCNYbcjXc!JK_2Gh67z`p$itliVj;1JSd2WvDIt~;%aBJp z<;bI)3SuSlXs3!;jXcI-L{1DMk9BI0<4!FyN)c@M?e}60g zA5%tjDnBDZ%zqP8MzoNh4)z~v6=g(A`RS=uqApiPbP7LRtX}MoDI+?-PlH)hU>9XX zhxuvs>G0x>DI*F3PBRr#Mzn^X${ewaGNKxX#cUw!5K~69o1bbGiaJyo(I$RMlLhWJ zri|zyKLvBdF=a%D_{lRY=ra~mMsylKsXHH1(=la42l$DYsE8>eTFFo7sTaYHGNPQH z(2*o|QAX6}$78cYOc~KJemt&R7*j?xogbfMid(3RsLPM*sfP+6ri`e=k88~qA;j-S zbUn^G7E?wvm9NJ!b1`K^r}Ox5GE{dlWkl0BtSTd-A7w;M9!oMI>kv~$w17tobIRds zl@T4`(SkMLJ7da-x;)ZW2_w^E%7}6vsTB=kv39DN0zBMRx(I6fHWHF~xH_;6Jg8O@ zYIwLRPz%Rs`CZ8NE`wtPblDp~4)<2F0e5VDeDG8c24;rjX#{p=_`Cjn$FR%0r@4oj+Df!T=xdY!%O? zhJ-W7Yn~t?B*QfShm|iA}_2 zWY}pTwi4Tj?Z}AJLF`0Eoi1WGGUoIkC!Jno-04HEclwC~$m5(r;xy#(&Jb~!ID$OE z86}P(PjsduPlDN2M8Bbvotel}oLR(8kf%DE5@!?VAWw5PBW_Ndi#*-gg19Ad9`X!l zE8^D3GoAUwZHU_<&vLdyp6x6kE+lS`JjdCAxFc~VgSZrVk+Y1r9C@*`Cvh+0-pEUweTXZF`ywxORucC^UgoSK?oV7zT!Xya zIe@s9cp&l$XC3h%c!;Qx6sIq;jHl{2KJClgf$K@T=R?z%@-OC)&ZUPBOXX zpHxn?onHk_;_xlXi8k@8TC-uEnMvhD2l-WbL1+@6R8F*(UzOp)kbz0%MDzKT(3%gs zC@0#+ubg4Q!i1B`iFWZTaY4XI=NIAhma%12HGv>1Jb!E{3Dfw6y<%>s z*d8Qw@(ar_{M(&`CVoLf3JlbU?M6Z>hb1MUr$%g75)%0NIer)p65EA@Bz}HMs@P=- z2?2gyS1COG*kTeiex4S9W~tcDBni#Tit5?p>xN-8wO$F?V-l%L&VLBm9BAqif7Hm(>ITR=iOKRdNb+_CLQXy<2* zh?cC_wj@;YGa+JxV{Ef=morOramVJ9kipONW{SvUYZAQtjDj^?=>O+wXM42owO@6g zo(SW4a&@um6um|7hOGSzeKUP)eS28r>jv#?nD=9;zK_0IKNx!ThxOz1Q}uITPLQkg z8(}8@`(cF8v-&Ig+xkcPm--L-Z-!|k8R634+!I4gm+JgQzbq@_{Jo{65k`t6%yD!F=jr4B`ZgwT>^*Ojaj$J(z6IV zif}NuKjsX}(zy~piHn_%>k~{L64G?-2!x(1fnPdZ$IF^-;E;^z2Ildn8=K%JUU>Jy zeqL;=nC?xJrRyZHSz@{m+bX8}c0tj1sKhG>%O~+V!Y)NP*cve1xm1=u|F_ov%8Cy0 zhq_9kKhvbLqM7`mS_fKQCzTcL;|~=jikewj(H#CzN-Eg5No7UT`GYup%cQcRIsC!& zIgrksR93W%KagJw>D)#%I`1H zp=z2`R?cJO{fdE85NPX>5kq`J}R=1h=g8#Yf)ki9HWqgLVgQe z3v5yFyI>VUGGj8Igg$=rpkLhNJQAkxn{kBTWG)FdziA``G6Iu1BxLcMx=QQeJhDkh z;5Xs?-;-G+l<}M7EzBgLkl$D;I$2C+kkHF-%&!&akxoJ_zX2B}oJ`xe%k^1~4c`(V z!R6P(`oD0DR1%8#^_rM3e=>!HY<``Y19pEhnS>U8EjB4l`bj9^*ESdHfBFAE89|VL z8YhO3*E$o#F!DMlg1p{|5@WbmAGrGl^#*Z*$H@-tL@3JePPL@($;G;swMDk#{;55idsGbVy7o0bVZxP={zUaL3 zpYs3z%=rI5KL6j}%KuL)Big{r&1bp8ge89%9v zXg+@(XC|CfMs$?FZdZ$lK^f5m{#tJktl6Y8qUroq*af~;8PNj%sth5N5l!W<<`#(> zQW?=2{z{2hGJW!QBl-$N46ubVqW%139Ed)tjA#>osmX%0@}x4NjKf+UA|6miw2{Bi zS0X|PWkfUi3)x>NoeY&{G%82%JxiH71GNSGLxt@BMWq(o` z(W(47Tz7U-8PP=kTt%*^%#;x=;IJ@$3{z`k!f-U2|@mtRVYHr=_J(h$9!Uvg~>4zy7;4gC8D|? zC83-@S|%nYo*W?|g+B^YD8nwpBvkQ78k@x~LnM^(N2WL;Up9?|Vg3j#hYh<7lF-T@ zo?#_wf9LQ2f1~{`t^&~j|Gu#q+TG$R5FO^<<5;b@3PgMOcd#J1*B}2q5dBW{Ui8OR zAeza)>&}NiqPPk~2l;o<{YUf1RUm5eZ(-0B?4knE3jS?fB1B?w6^JJAZ;Ok;F~n6M z+RDFy6~aMKfoK)~x~midueb_CGx^uJG;>@9qGSB4&ej0zq5{!s4(owH>t0+1qJ#X) zf;Hk>R3JK?e=#b4-EkF&=JC&G2Ij+=sz9`se?FWn&Qt}WjDN1f;tl?|3PhXvXWjV& zaD!AJn#(_H&F+U|s6e!Ve^%;;Uw2#uq8k4!!-Z)#;wlhz_@}U{BnEjAepd zR3MtgKQ(j2{ZN5uJO8Ao9)6i|6^K^xPpm>nnZ;Egn!!IFEfsfN1)`b!V^~xic2R+- zmwzmGNupoobp8>Jn2INoki|d3&Q9?J68!w5^f}_hToS7JM+u@2ZQLQDl7CoS4D*u2 zZ4xy8VW7u`T`Urk_=hQ}klKx#B-HW`aCxY>kAzYF0nVTj_mW`p4^mQFVHbmhPX0a) z-HhubOy%ztcGgaEI<9{#TE{62XgZ4%_~!2BQZ zr@EGeT>f@%u*~#N9zcSZzg?7=4X?j7B#iO5^MWF^y_$p!{&u!k7^MA4DC2J@Rtnp( zii9TqwpAFw_kIt{nC06xQjBb)*rU>E2i1;z`HRluL>&~ad&ya68pCjLNz94={{EGNB@-62Z;z@E-`_aNK8V0 z?D~nx#1!NwZYnW={M1b&rV}%epShXDEMhh>2l=_1OUxtYBfoG9kYBom#3JNZZZYy} zw}e=V{KhRqe(RPKD~OfI@7yY4HIWfH@_RQ(tRdDSe{k!FQ;1WM8{B$g1F@0Vg#6KM zCbke;iEYTA+;(CIu@m{T+ePd~{^Ir!dy&7oeZ+n-|Hm?zq)SWHvb7?uQmfUPv`%e6 z8-usNJZ*utv$lt}56tOxFuVuC+Hu;c+Bw?A+Ev<(@Fp;{`yr42wDywrCcF*)>3M$yKQ7v}%}FWV2G&0q(3J1jR=LcjmRjAM-$^jSK?IN!L;_#?A_s&|0Mgmxr&1Ug+z zA$J&iP<_!{Z zciX^{eFDNMl2|Qq6vB;2VEVVi#m?y+?$c6yP9&QLVlN^B#6Z3&&$MY8k~!d{MWnkDu? zxOf{oUChLHx?4*T8wWbwTgBb!!jHPNUhz?vcDTgd2>oD*2N6c0M85=nd6%~nOI~aS z=<=P1B_B2|beWl0G9lLshc+>x-(~KFB`aTIp2T(%OC@L%e6U@%+|tIU*k$8W>~iFp zIr7Y0oXx*`7jZq^c;VfiJH(;7wQh+g5PGcy-lA@Ott{c)@78a}lJRft{~uRYv@DoV zmk1rr;>wDa1Y!Dea7}S#MQegC3<-lcN?FmQpbPN~?4qow6?Cxwe_UD7;-J&nx(s$v zRCu#?M(-L)v#FY~r2>NOr5dkYFS{n3mzc3NXiMl~wmRJBFuAFE~&^wX= z!@1(hi6#ZTU8T^iF0Pzte$b0k!o`&n4F-*o3}F$J6HN*l9Z4cq-{?exI(AlzD<@hU z)UoekTshIEpw?9iL*nDgi8cnca*^GSD<>KZYSL6GCt48njAUfMF3O2^20f+z`LK&} zqJ2S6e(f-vhjOBR{u}p0hqt(Lq8k4VMk>NC0~DH$@ZYc(UA&)!bpC6>8fdwR_mNP_ zf5l~o;=Lp^a9Hj~9HWPXG5(7d5T>e|ghKxFOfjoKyo-cJ{&TKa{~+GE@fbffiPTNJ zgM9K2i00OmNcxutF;AK z((5HKAgR``lqGyp)%yKdGTJ5Zc2;{cu;j%jT4FvN$TOr@QUS*;>g84X$(t4GN(t>%=@yhF8 zuQE}s!94C4U#l`v(}HRXG^(qrpAIuplhq`>d%0zVrbDE2xhFq^QQFbsJPTfdekC`aQ5e0(TkRyT` zV7*F35Um5TBQvtSh+pMSkdMO6p0VC)`Tok~TO2eY!hP*ty2si>*JtR!=SBgR z2!dV)@#Q2;3#Py*3%J^4B)Gv8?3ou|Nx!dNf?W?jSne}Cow{(c;Rd6M7ULE<#Q zpvN5|4iiU^nmbAyBTh%^?hN8gq~XpYZi4i>n-XUe=OBIVX2i{jbBS9ZO?OMA<<28+ zg|ywRiSv<;yA5$$;&w>aT|it&+#Z?W?m*lTndt6>OmY_ycP1_-E+OuM^t-zfcS9z- zyA$_7rnpOq%ZST~dm>Zay@-1w1MWV=705JqU*bw+y1O576*9x!pST*C>8>FjKwL{a z5Sit!BOXLNn0N^BP-M1y81Zo85y%|(Na9h*T=!_=F~nn$dG0tdM4TXok@;?f7)2Ji zF=U}TNsJTMBa7VQh{qF8AfAXUc27cFHH|CZW?9_@OVzyDtCk^h*@ zgPi|`u$oUQWcZ8pO1)NZ(mVA5eGGE^^YjJ!&iWqz&HlhMj5(0)UuY~gmKrOJHO3+T zcpi_x|JVBe@FyZ(OLKpcz;sWVi6L&9c>#(hMxJRVhWBX}roz&!R{YG#k-)T9n)8?} zVfdToVl18Jo+RSX^o8Q1bPtA=>7LKAq%jE$K+`phjMM)Qdv5|J*HxX1o~p8Ct8LV7 z%d#zOA-&hqtZ|z6Iw}0SE*BC)=!(RS8M7K7iSnuDE`T~DT-x@A2 z3ztvxCBx>%hST_!H=OoFzIhru@HU)wU--5hF0TrgxAWz6HeoiLzCC>7{n~IkTZ9`< zXY*mh8a72XthtAOvL^i9nks)gWLc7521M{exaVIf&5UJ&i`Ik zPtzo~ZtO z;hIa4n7pi>s4e*dRAkJdo~Z78;fyE2-M6fss4MbUp%Ml9zj~ss&R>O81WSKw$B`if5A{Ul^ZnzLtGcY7s0;G_ThatV^+ZkPue@Okd{xWpi5kmai5|iD z6ZJ%O<*z*VIzEkHWRo9J|0dUemFth?`XjmiP_F+X*MFAl59IoNxqeTs-{tF* zyB_50+AV?Mb|@eeS=)z$XEFImSJVy>k6Sz81RPC)fAO^#gn@c72eq zrLGUj^}}-g2ww-f{z$HWEZ2|nb+GGWa{Uv&mb*UA*P*UY$n}$a9q#&+Tt6+>&+v7m z>rdtSXL9{>x&DP*D|{X8s>-#-*Q>kga&5?Ug|AQPdYG@*bUh;1N9FpLe7&~ovwXd- z>#yYcIk|pbu3zBm^<9t2^{@GQL)RDO`X#ykja!xlJGuV7 zT))QG?Ok7&>o?^34}6{I`lejJCD(7u^&jQ>9l8F~|CaynKPUh973zq(IzMs4mh^^o z%j$?KXz zbI!VDbwpi~pTL>n-RqXs5w$ZvamgjAb?cVZ5%rY(#06{9Pgu9Cj;M|KiSuquoxN^Z z9Z^^1C(h|fpS5mT9Z?hciFFsGy4EeLBMQ&)gf*wFUAL@`s7?8av#&^>xo%kXJ zU7J&9tXoz`)Y9SshW==C`k3i|E#}I-&;h+t*z{l3E>6efjNNGqS9Xs8oJ@ z&$(&*i8`XL&5!q=O@c@rQJMUB5WDJ#TASZ?P7m6jEUP2xiu@QS(JiYZ>g@a&$-nO9 z;D}16M)Eh@uqAp4-fl@mQ(yju(mCg2-9@=EnZF^smXy5(xp7(khV*)P_m=17#+Ll` zTA`KM&p zB2#;L+WzF~OV^P~IVCr)$X~sFZ4PtXC^shZSD({E`r!eaV|3^YdeZ%J zb)Vem&W~(Adl)FRS8k;8BPc1u>+g{p6Zw(yB^$Z_|7n>IS^vNP!WQ&@zuJF8;J*|E z*1h61A?BX^1P(;lxb77hxzV4W*nP%n7p{9nT5dq5Om?R)SoaDI2SIXe>q(t|Iw10l z)Qj+$dSd3sneS)5jl9|~XTFem6j`=^n)!Ig0Sfy~{jab9RY@^~-JT%0){S-oAE)6zddCxGv!znT6!Wc+?E z{V;k2d^-KH^oP>#MK0idVz(0e&0{5oxLf-H(oEUr)Jd968|AFg} zQ(Qs@!WGCceqtI-5BbLF)W6}J@$aO*k@`yNuaS$~fZy_y$VdD@>OHBqBTxDDIJ@u_ z$Xb3`>ZSZ@|3BXK)W%1z1?(?;bO4_hJetMl`HybK=Y~f&;B)<>XW{eQM`7TkdLFqS zpXWSsCqCCbatl76@W>24&wgY-KF@k&0-s%vJO!U?A1UJV%tw0hdB!7~@VVxZ_4qvf zk+t|d?co>WGxP9$_)I_i41A^@UczVe@L>SzClBw%=f6KZj?aI4cod&Me)uYU{^;S$ z@%h7tFT&?PKiq@QA3S^pKEJ>6LVSL2<=OcB?#k`>{HK)#e12!;5I+BLWj8**y)uT+ zZ>|jE^B-2O#OF6wF2m>7S2p7FYb)LO{QDI`#jiG~KkQc;&%)>5Hg3h|mm72V{F}x! zKEKqM#OD_q*W>fA8)bYx*2v@Y3ym%K{9NM#eEwB~RNBurGWh(<`UCiUw0<`}AE}?f z=fm}*_*|*qh|hX`Cq8R+z(1VY*-&P^`zqLZ}e@lhn|K7v({s|QQWl;LlLHGTcmCVQSga7{b-w^n32z;w6b3uA~;--n| zUSeMFqOTKE`=)ngi6i_eecdy$YwvU)5&sA2>yD|heY>+n^Pi`$Hy)ZC-<@mV>z~lq zol_HIdvfo?*MFt2`wt$R+?_ugUw?^v(_{6@0 zD-WKrxI4t}G2kYyRhfyYIR8zFU{>(Cey2hWd-e;i4?ESh>I!x#%KV zWbgi|ox4v96PB(l$ioj_SuE(n1BK|E>76I;xpV2R2js#_4A^^=`-_8xvMe!EIp3DJ z;DU{pUDQqZFfH&YU0E8@#fn2=1W1iWz4uPuyL86`{ITi{2Kz^bx8kRT!a`+(&Yhvh z-_*@0aC(?$;7XklFCx$yq`6ZIKiP5nU3V(749*6-N5YrNOO(j7qbWb9IH(#*F||&yM|jcJG&$zzPFl z1pvoJMM&`J`%fG{aaZ_k1`)8eJfhRjReGAH2NF$8O&l-^h`~rO6|Yi=qVc7>mX0rl z&sEb8VF!jw^7uz8=ji-t!k|q7gVrd#^`RY?u=C|s3^D{Q4D=TZBVmIB{b!@hYctoQ zD(|lJ+SHp;+oLZ>KOd1U7Y6+) zW-6EJ=inc?gp(u55$D!#l{Kw#v&Bx62exn0IfD4r^HaG45 z<{oCMKDV(CB^Th=FqGx@?YL*@u3Juo&-e<%Kwof?!2m+S;7eAm0Q{QVDfk8A6T%*d zkIG=_&uv-3Xk?(!Un&+0Tg!~WijmbNw&o1&4gt;r}j@z87nN=63TC}=L6Acqc@$n>%{Z!J8{R7 z4Vsa;1hzg}+FHbmly9wUvPCYtj3|*Mno*)65wY@s-c0MKy=VIV+wXneiF=4=#fGaE z8tg9*6@+MxS1z`d=yf*t?3vuRf4f1fB*MtW2a!*-{$6_v8?1sFAy;{L>kx0uT;(EL zCa{*n6MObd$})sV%35?mY}QD0>6UHxEIse`JHqFx*C_Q5mj~oE<||LM`2&Yv#T<%i@I6O5IK!kkX>~4M)x|Z8F&fOm>5k8hbvi~pV{Z8 z?l}7#xN^Xh7iC4j!qx24pB;>Oq`Y;62zI8@*EDl8W5zZL^MvR$J*HG{$C!(yen@lW zI180tn>*k(YpkwY2<;FHu+1KX#XFp!eHrsF7W)T8zbnsGuFw_Ifjak$?H!v;8BMyz zWpoPG|G+#1sR;Y)n1aKZ+L*TH!*atW&d0-PFUXtw0u28)~a`CH|GH+WHCu zc=$j&#lmc5&{hb0#|GP4&@h&JEBW2Z^j#LV|gecD2pqFho z%R&`%V5vPh6z4ndpMK`j?RW7<959edFdj=o443kJTKzpQB&J&6a-)l`(xLF*uoJiy$L~ z&=|E#dTd%E%QmDg4fKO}`L)ZpRBq4}lBg0H zYk^8pDh>rG%~h_|>6z=orkR-9IqjUqWP!p9ds9lVXzk%in;3w_9MszR$~8Ja3(n0! z=Mv(?;|tq`8ezyyoU2vm^2di)qzL3Dovv6oUU`Zw5L3_X1=Pj>X$pM6kO$hU=Y~r~ zC@-VMqN(Rs>oNi-w)|z8_|yA7<2~A1{;-(H@*5cy-grx8ROgRltH==WMi)u~C)gXr z;f*wHz%=Tw0W||O8nAVyGNP-9b$oc&T05cL16 zqs;3w+YqDsx%6eJkEV{KQjq^ww~&9+jboMF`c&cFyO}@9yA!?z$^o{R4geZz%bx-& z77P7w50#+&C#Rd(nKqD8}K zA5#bc8iM2)nVnH8Mr#kX*tia+V*l`fx=$7>6FR?W0_?>UK)H^GJrWhbmB23ASlFw%zw19P3I3(kq5e^LAcHVnsO-}P#Oxc}vt#$9sj$ilNKmT) z1HZrOoe5@#uTbs>=*6&{uI$wng2B|y29u$vaxrLpve!(o9uf0tq09^h9#%eB+0#60 zh_eY`z!3%BU@oRnLJ3Hkb)bI~R!q?J0{!=r|Bv+l7o{&wy)!k1bHINwq5!7;o3AX` z>M?6as2ck&RDpLAMF$&%bc43m4(U;Fbea$Sw#vLNkS5PC98DDKv>=LZi|cHprAHk- z!vaUr*zjL*L|iJfl{s4~#-Uts5lBLwnRfxYXIrlj&0gpq0Ec3i*=%K2r)LHNZ|H%E z@$K$cFnd`UAQmb{smsr7$3Tjt5<%yr9V^^cIjYkOpvHIYKQQf2FIWqlGGh!z?O7j> z`ORa)xN3xTpjwO=pcX1ebg8)VWhkfU3zRcPf~ZUqEsFAm6$qsZYU9pTW^4u83Ius6 zGAAzsxVVUL^afJ5MCNR(5&J0>!D|Dt&sA8i+nqHx19uY%eCanK=fDjM~|BXWb)i=0FSBSeX9h(eAHPB8vOcJshS3%sTY;QpI zzq?R4lUkcP5B>jg=-P2Z^pn)?)J>@+bpE?P^^(-f(f#uwkR>>Q4xdLePs=@~~|W zVukq<4acVTA3B&nlZV9q^T<`iT^jc8vtjnvefV)7R&1D?_Ti^_xNq#>RNrT4|{#M*N1=L!w=XncN-50 zB)t#Xu%55bKx~9hp2Z;xJ$#GKKxap z|J~82ko~9B{~x0LPo0eRQ){7Hd@Xt`nFmBa30#19K-72~T!7zb|Gu#Ud8WPbvGIe4 zaO@o65!}jq^8pKZc)8zQ&%^0$6F22KCyIZY<4miNcs0sD;2f;y`jA;c_(9$7X0P|* z4j4gyPIRC%6D_S{qFrfe1Q+&~|vidpV|Nmk1>k%}$cK?o4Za1wYq$KSe+cUAT!DeF&Fe^NKq z%7hKxlJ#c*g43orij*_e3QySdY{K+#ctNZsvM0i%Fbi!&@r!mD7X%z+&kSl_ytKK|cxkcxX2hYR^kDD$r6AT%73Ff51A6|r!5%pQl zR*vZc8Ai~ao%^@%pSEl@4W7Yt5dZ;I;l+9IwQB}j^{dctTY<*mDR&ti0gQ0 z^&>mCG$f(YVqvjzr_L?OjhrHHMzlf*FW|hg6rFxidygEJK$2#`{0#GzJDQf*)Xh0w z=3P?A&_f5#3E?uBoT%e(fqgCyaX=Gss%O{&#E`d;`)X{;8M2uFzTd#3LWdX$-T;Y) z0|SUA1xMY%%F}fPNyFGiI)E?&NI-GH;K5}CDu63vRh~Uas!-}5vG7-*f8_tZ2Km3A zNB-YNbOJkwUK+o=D*tz}@7OfWpATwTfr4)Knq%JWyP!R~iY*t9h?1dT02LQ#ic z6F>^}11tsVN>^ksmXonVg`VW4M=K{5FGhHuw@4xn~yKDnWo6peXD#T++>0s66+SR&Y*^%|PfpVFiB!a{eLlau~9$ zh{VqOZH1Wg&uK=$1l7Xai@>N>=bXO*IsXbOEtV?J(fI|P*a2ibOJm2bg8^fKPF;-z zbnIs^!24p8XIgGy5~)it_CJO{!xMqxUDiLly1%Cu%pn9?Yj)hDu6JzQ7)vz`RT*}cUYi|XV)C7gVob?{^SfgL2r<$I<;txA z#$^f^ejCKGC7@ow?9p7Ng=(aWNY2{!sj+cQ)We>7j*g6orJ?lqSQ|FLI|2OyHU#ek z0n9nVY9y@`2 zxU<{iCbBz5p?t;Tf4id0o1y=I9aZ?3r#_W>TI$T`%?JxTj(@XND}oY(YieTW&T(Ue z&YzqIP^9GzNp)_31Jo24q?QLfU$q*j5S0%_Jf?m4^eXQd3`too!e3ayDq9lD(Q3EC zIrsy*5AWY|WXy<3JsQwLOrS!&N*%bH@{GbKQ;|;(K`|84EXwoMbvnB|{!NqP2PX{C zU42&L0(c1wdBQKZ#01IS4e%+#GE%kXX!QxUKp;~Fzs3BOOd;WfOc_3H!4D!uqKFhR z;_=Vc+2cWZ*<5fH<1g-RK%RS2n9I03oH3(A8iii0o}~+ja>;200v}S9Rk|rt!;2J? z(+Z3Yz#&r_HWT1zwabb^suPPbMTW73QjIb#^h+<7x1& zVR*6^sj~@Yx<5V8XP~4GnVYI->im+W#-^P-Js6fDrLtjY&gN%VkR6KoH!4hpwX*J(^a281z&SC=)o2pB z)ktAjOpS%ARWQfH=Wf@^^Any0^d_JsQjISF7bZBI2#2MrmoJm2^rBF+=fc6ZKyz7` zt+cJ#^JRwmhk~!Juu!%7Wf7ljFv%K#h`a^(iL8bZoC<9XCf;ZA>>xXjmE5_iS1}Xs zf^UIDhh^lbz##1=G3?Xb!_ST2#DT8xRz4b?`ml~r9!g#4J>;q*?e1*Z-KvS4SKKy`T)B->Lp5KnBLMz`ZzzZuofXHH%yOKt%#Y~FWS3|?VTJG3WcKL%7wiR z*w}_`E%v$3U+x#P6v~$uFozf5@_)x!feRRyNLU&r_eOCLp%QLLok*1bGoIQUwaN2a zLN<`(`lW72%JxeyBU5nm$@Be?Nq7fx3v=!A{{G*|`a5+Erp+%YQ-a+^`KQp3LxOqE z(+R^~PNmqtckg8WQXWz+Zk}_k!k=+U8PjEcgU@h|4Rim%e@4j|eVmTOzwPBboiJRo zd3!l)CER_N-R)cFLrzuWA7n4EyVQ4FX~W!=KAhws`Mi7Y_2F;( z@RL5|bR;$r`*zyh?6Z9MK^x{?Mnm4hUViy7-0OGw&%#~K+X_R@ZQ@}cr!IxzgZ5|H zC;N~ysW{Bo%PD7J$mu;{cnAM>iXeHe4|(7C2Yq+@U4~@1`zwC;6+V2u4Gt_nk1mkZJ-XsMT^q zmPK>h9uaO3qL2=y;bF<3nW?TWdgNHYsRQb^#oVTMQZTS7)-OB{bCd1{yIIP?s@AkX zo}1?uh1`u4@0XQ-`XWL=2E{2CSto5|2H7y7UI^E0_ z4SUpgguS*mg5>X5CE-gUq6{YzCD4=?tJcOqtkd25C-!NBG)!-stN_Dn4M(HzOHj~F z1K{>j@co4pog-CiW5BL;czGz7$KA^%y1PGMO4lwUNO%760E9)&Fi!e;a*x zuS`9XdQR%x==Y7sNwRQ(7ZErwY=>Xi@jN=4_ zh^#(JXSzSzDaGX-?KG@cWs@C2>Z1#9hMnFlX$AcSR zhH2_N$apeU|BYCV)NIwd8pvbEz1+?%n>HEcIxUawkS{5Fqz~PH_U0UrrUA4XjV#hFZHeZqg#$O(VN(~#-YTw1GH!&c7vbm`V z5CCZgmPXLPz6X+n7=qMT01;f&%!){zt6B>K-oMQu71boS3OP`HlM&jIit6(NN+o1) z1!ZQoY7Gp6129;irp(0LXD%K}9V}41K*((4D9n+nw=sx0FYWP_RZ%KoKyya!7U!jd zAKhNi2L!(@l#f=ed4W<6@j>IYsw{zqjO$WtzJ;NfY^Fr=fzUY)0Um2y5Dy?3`Y2=o zdD~{9%Y^J1XIOC0tLybxbwY(vyhUvbXn^^$vrGeR(ieOQIFHLH`z7#`Z`xWH$oB3+ z4Vh*Zg8c2#V@z={+OV(1!C*WQiC%+}CFS)0`pg94f4_kE|Ho5vi2waYXZoM1TIFM0 zg*HyAZ%pK(XhGi3CiUEKg2YT&(kaj!rs_41LD%KP7LktNb2g*CGVlW>4DAwI1UcYY zr78of(_W}rr-Hb1)#6S%IRuaBp@Fd`dWY;)AaDke`9nU<^6{!SD^R5!EkF#tm30Fx z%o7FYP}>$D#sT0(L)xTe(^su!0i(#~o*NHMY}f1ppoloof#*V^uoB8i$*2An(78NF zv{1F41+3(5>fxpf@*eR8l-c7RvfPr|kJ@G+O}ac7nj#bnGu6&L3)K0G9dOmCjkO2v z2o_T`Kj}i%dKSn&vv)$!2?%NyfXWk~*hvzAhy%l-3}#dLNY$Dah|0@Z@5Ts}MxjjD zT3|FSS?>-TG%=K(3*eF7uplHZa7C46)+q0C`Hy8vQK{B0bp+2|>_>hVk%H*|17!b? zvH$;xsrP~Ye;oZ<1bs8{-_fcSKg1OhqZ`F)e;|y&R@*5gLlpC)gfkWiPpewNgII3O zjQ~_*1y!1%i_(gd=F3C5z(PpXMd}kTv{<#41_3R4;_W9L(XfySHqtiR_A(1A6k|z? zH&?Bx0W(Rowx+f-<_l2K5B6pB596?zNg7hXDjY>t8|@l;4p*&-K|Hy@!hViu`t+op zCkBRX0ZITKg$XVF5v$h6AR)yVWaHYV=`AFi+Xs9oYKi}_0pT6ytJcauvZCS%9KOO`eQF~0x4n6&Y9$bHqtoAa35;D6|S-I`)8;uEu@&!RPPovT_cV@Pi6=D?$>TT{bgTHv|;;I!f3JW_t zwr~4x0S$z_34X;9U?I{j)<4wV`$VuueyH-9xvCX1vWDK=+#XBFGrRFm0=2z{4jv4P zoVx#O)c1svkIc`uvkPa3iSd9=wln5Ogb`H$rarH#Wb9_?X)2iJi~tv%c!ratr=cg6 z7OCk!UtL|u$jD>J>C>yyO1sh-c_{q?x*Z8A!v15c;KLnK+=el`$PH8ywk=U{e|$Iq zMx=+V_WwLg^?$q5e-Hh?5A}a{r_MqDufuIg{pA1SrmEFNFw$St&H0K6+p2~gGlRr@ zMR;1!ue%)dmAR@_L0=O^7 zNJ?cAdx+ZC0^sT4Zc(MF}XxKSh^)ki)7cOvfd(V6eZpy$5)ustxfID(MHN$wW z>ZOZedTyE|lA6SRcwjIW*#IbLkkkoHlZ;ius01{b4lcHchm&<=e&C*MtJ)V> zsa?#$R-j}CP`I#~qgAhCWKT&CTLBJ!QIqgCrtKjiw#5o?F@;Y!K_4BQ@Eunp4! zBm<@v%~!pUktt?X@=PrLA+&>eA^Q`OXB;#X2hmXAEmf~#Bn=W9eV|FcZ3>-?jjyP90J$61V3k(+=3oNapbr304B~UKYE_J~!EE~* zUs2~2Y0LpBp@yBr_QxB*ezvOXqt)gz#!b*L;KP&+CWAsJc4dGpu@)buu@(3*2Sovc z57UYmRX>V(NC6dLT%_3PI+P~aGP{vKc}RhC!d58%XEJ)MssGpN4nW`r--{l5JUzfp z)&(fu{RbVtR`me;Ps;_el!yEcG-S;w&%IVSl_I~^e-PO)`%6CLgd6^C*7GNFXWI{Q zoU+3|$c6NtDWr4cF7zLGzDMq$-+h`7xwTf9fjj+#;otfXzD+|;D(ii-4?knWzGwLG zfBEq3Hq3Ii5zmn2PE=vYNi<>jRsJpIB=>S22?uO@IlU(gKg~Ztx1pWAm-z6*Htgf> zT^z0J`;Ohsa+VF>&7Ea;bDRysd(q38C}DWD{9yO~-fdOG~QI6| zYOdxbP(elHlTa+3+mjzunG38u;UpB36^NP-pq`e?P-bdY#T?h3O~F#}j9JAJ#b~v& z&Yv9-jbZB(KU=fvWeMVN6{qVNq69z;S!@HEc|wxDFMuKmDMKmG*G@Mf8hlV(C1O^n ziw1oO3UGIF213;s?H@94<7~|;nC1Cd`xmPVaB!!*DY=l+?X`c*5Ay}(iySAJu306s zD0iG-Xw$2dhJs;2j;v_Ykqj#E>=Z?VDc@4_(&eDQa07PJyc8DDiv;`-q9bw8b-?sX1|7!xFga1bdMA$RE3nw2Vt_)BPQ<JxRMm*lljU_mY?wMFoE zKq76?wqv&DMa;p?z{;x#QNTpz1-~&52^r8W{%79@6rV$}2;63|<`vArFUKOlYp_kc zX{-*fGMX#`d<9}?0wNqCSMvhqfUEKNi^D$tF60$Wiobv@2el|r=WNX?mqk9t6E8fp z11Eq3XP|>xg!yA<^DWi9a5(@6rvId#P7TZy&jO}5K}aoQGfIOg_>1B1s6*<=gSJgI(+ez#uea*N-nZ8@rPjd zpr%*M)vO9ibs(w?H1$^bIB-x_0CPYgeG3ly>{MYqG9pZNv39wt&!UI$X+tz(E0HO&ec>S!7HE^^>z?PJ1^^N+$)**c-r)+0OM0w>DxHXkmyeDlG0oT*tAvlw^G1pFP$ z0?wxk1K>z6f^*ZGLeJ%a7=}oB*;QYUT ziGKUk`+rT>tOg?PoA+R!$sUzLpj2oVX1>X$(SvbrDD7GKNNsi51Lr-v_GUcKxgX`9 zw4@oyn^Ph)b zSxvgFh5sR#JE1hr<;0=Fo)@uL^LpkO)dAgEHrYX z2T^^bW);kmL^HL2@5GF~it8~dP4H4f(Va`HdNBA~Kutn(PDa(4niVqhd1)0PrWL>_5#f2=tHqf9n53=l@)a z{QslTkD}k~oc}vpvziA{eVBk+s1w^}Tq>D>4EG=t1_r~)icoB==pmloCOj4NV=P7e zE3n%ka}xTV`20|uQDA7wxz{d|M3!^&+|D(XTzLUjfLeI^`&#lUeFflz%4G6ASOue4 zGI9TtC(M8u%38#C+GDnDARozvPN0%OQ}bfRm|xVi7gd}g8%*|-{*~Yt^%sGFL;V>$ z=VoeF&=?n;w$rK|c`OPmCAI#A;0F(eS~LQet3JC|H3sW~)gs|xn8)P3dN{E4$n9#Y z7GZ%QM7KvIBVxYh<&0sIIh&(per$p3(xnca9Wg(p{-V!2NfD&y)U1|KAGu8(p?ZR+`d z(xS%E#Aq%q?sI4|R%h!~tznG>*%L$?O^)=!(a^ZOJX7;>#n60`TQ3QQ zU`k`ZF-{33vE_txNBL*tQeABzJWH zeG}G~T5Y@d>_d2gz`!W}|J0}vHJ|^36TsS@{)JqCMylfpV4b7?I9uRr$!CD!R3JG8 z>_3tLpux@Q{2&cE(3a1JAk-&&h^NzUvmT7i zK4!noaVrpZBIZIwo_?Eqr~Y87ciM*8-?w3oyFk#NP35?O1wUDD2-)NAbZ>|`^U%V% z)4kl}A^i5II@xsJdu^C~)P^~Gq3PT(-#s)nxve*Z%X#>-e)kuA_z4^Kg)lt*w(psK z_e(zfR~u%1iEMZ``m=0E5TIdhg?`KD#q{3p!{>c484H$xvI$g8+DDgftH{4JI9-_lUA!U%8_aQJw2tT-9sO1%#bcbtJ-yGKl z+yF7rp}}b=b}$c`v;os&C{Yx82C-ZSY%gjK0-Ie?q76Wlik41_q6$@V7d5$}3>HvF zOC#1T`e4n}Z01IfL$TbXF=uFK^m|Gtia#R58su2Nu)gwEY z;h7sSJ8Zt@<;yHVyV+A>;w`pmW+fqaA<NGi|^o zI;4Kvq$qim%n>lf9aq2}M3SEW&P3f5ex&C5|H%kvaPEZv?-$bf)TdKVNB++nkrw!P z{>{{^4ob{K_JSJfsfGxh$jA^m97$eKz!uT(!4ZVlgPwS-<`qz_ed6)b=0j5-2=28# zU_c-oP9G^skbz7&t7w)e14p_9Pk`D+m#UT$x+g>#jOwX{Hk?)x>N;BUs^*X$9zVw& zL?ku~9^H8htbqGhd7uo*p^1*#De;RnD`pmlBln>(3{>YCW_LTRl-!5LP>^C6gVs%N zre@X5y2Dh>XeEb=gkWL9xWH!MLvN~GaNr=!O%60VvYc`Oyo5P$0e*bJ9?avU8K1jD z8y(On73v`j$XsBy<|WMRY3M#M0gsiL8jd(hq0p>HI*TC+lm=6yJYBQ;<+u>?5QaQ8 z$kIr)DTB#(6^unYm@d{iXenFz& zT(g>|AbWe*q!nbq%bFutox>0}sF+JKX)$*ReeyNlyj1hr@7`hiQ$I#RqQp&~wB=aVBXtG3739d6uS|r2V z%9q(Ya#1KPG=8Z1ELgj7FW^$!!hBi){au4!2i{|=U5Glc~Sy?%|r%Jc*jjQr{8LA!{S@qBq4pMJ9lVC^95& z=Y^WpI|T$m@(k2Aqf~WkyR>0(+)-`A3Scziye-ewtYBHZTbvE=D~K3|$TZQ9pm{>; zR$~MRVT@WYy_uR7E{nWmMPGK%1->hVc!M^IKAs%mtYM@U1@c_1S1rBMCZ} zkJqd^InG-Js(3_?(z+_sp)ZfW1r+81s|;JJS*@~QAhR$F4ylv|E}HrVEbqv|@FHN6 zbjV#Wjizf>uPllux94|1h0Uy}0xAV1nZ@q_LhgkY6wKAEOj%eXYs(gP(%l4Wl$`(q zj&{(N@z_+&sc!S7npG+@-E0XBg@kUf0m8IgMS?btQ>~I33OVpeM;aFSfzrR4S1boL zYzMg?T_rbnf^!?tf1B=HMm`8&pgUJ^GhxZUSJ51WGU#2D5Y+@&AB7mjCk_=>MOC z{!jh?PNXu?gQuSVGgG$`2sI2T0m`u@h9k-asgHY;5+IKU5k!U?+(RPh>Q?^{2eAk` z@KwQY;EdbPIB7fy#I^(npLg3l8-TRJQvg>&KsalvM;GWicgQ= zCHe~zc*+NB&GpNhdbsY~B#?%mhyjG@Sy4}5FbF)4%K4?}UsUt*TbIM3j38cALv(jZj zP4-+0WU#AZreazff%SIsTw)1ee+k_`!V(KLFJG2-Kv4RC=wMAWZ5C6i4pY`E)Y?%8sA97TM7tVd%?&diJ#-8_Hj>v`Khv)}9 z?Az_beLlR=hddeoHv2-mn|+rL|J{bUejjoJd;YWBAJAQPqV;kNl81d9gA7A11r9@g z%`p5c`?EeSRpq-`E`be0UM&oN-hP|q{{MV8ca`1EjrnlNhcCBbo_A=^*!cdb+|%i9 z7;#H%ZxMz!`48rNc-)44clq!+KKwZ!{+U=lL0pl>d$9|CI$Ryv*U1oQ42YmQe8|L$2cxdOgJ`UmT8N)F90=t{zl4$Om(|dQg zi__eDIUE`8{=n|`eb$pv8XccP~FOxS&0@iMmRadrJ18D?QpL(fthB70pKaRN9$Iy zEKl9sFI$xt$O;oial9fNzPa9iCgmt!Y8iPDdm%sh&{$?&PvU=oVL zOhN&WfGW`c9y(T6 zbVnCz_(MTXBX(@Zp}N&W#mUr|jH9^%9jYke4o$Xhm>2qU$zU*FZ!U8N`9p=?X^Na8 zIm|eBri~^Y4NK?}7N9a`6ru+sYqsu%&cT_^o<^&3a~0P)4I%<fg*t_F(t6>&5CO0>5F(J6^Vw$m|ZF2*{^zbH>p@Zfe z!9+Y<_cG>~o?)_1nIa}PBNT>ov!3CvfXog_&@Io@y?i;g$tYOmf$SW#*x7vDikEqhFY0C=hO+>X7FfdY zh}65bK8&yis?>sax3E~Z(&f1G%Qsl2jiVFjEYbPpo68;sjq?WjNB#frWcH-Lp8olC zFZ_Q?(ZA#T?+*3<$Le126qp}(=$AJK1-V#|M+5^0lWEtX-yRP7Gxjq$a2D!T`6R{d z(D^5K3YP)7`_uwx*a0Xg_`ByOMgbVO6k!}P>9bVtH4Qq52`;b}CPM_NGRGAPl(r-n zSexvpv=eG@8${83-HMl4Q{?9S6Z^!wh&2TJT)CioNxG;5iB2*=i<3Z}$Le0atb%CY z{_QUPjZuFt~^`!`sL8&ra1{+JzUroUv9WH3Ekg;;#|Yp;(D>} z^~rSQtKPb8d`gCprN(Z4EC#S)O9BbK+hRJY1yMhdj! zo!q;Bn=Ao3aah`7uqf7ia{Gz9?p(U(8FFDgKmd#-s5KCha)mw@>t4r9uR$duNa8YO zNf|&K1rZ}{pTreFHGnP}s*4`3TQzeq0J`Iz0Pqvj$8<5g+G+{yAR;fcB+t&)y^c9% zxd?{@Qx^^i6~kmT_MpAx0`O2SgPfi>U-ug3;NNC5+9aszc3|wWg_6u@A;~a(v82FX zs5e(IZwf6~4ERbc0KSXpb|**~*~1bT&_jUc>Q=w377{h+6x*&THCH$cUIroX7Nge) zlsr>J1%au|)~#?k_+r9QaRMSIcf3JNTAgHm>c1MqQ;`4Y|3Uq~DF6QwuK!Cvj{YBY zD}jpVqR9h-3%M2==iTjc(HOfCJ%fuvL2$Hg6;Sa5M?{1=h=GI#V&Z*?odCl85YeNO zy17vIO6EYHtSCC0kvTEDkrC3w5*0_q+6 z{(ru{x_~*}SPqjJN~+2Y?ox~r8p|2-AQ7fGf~4-CR|NVWC;R_eod5M=#Q*;^bz5pp z^iVY3D*Y4h%++_Q7A+i*QABo-bn>uoPN*c25>Ui8kTmE5PMuU|ju$@!0*xQk10Wj= zbOUh@95%7JsG%Wsph3!RV6qE!t6gSGZncTkUeZ zQDoCYq+;DsKTtc0m#Mjyh;?Ks+RL zK#-$#D_#!rCq!QC!F5`fL|6d3o7j9QJT|1KQ=oRcg4u;q@@Jh0T#(F6F#-e zm39O|{|vBSVvxnc;ks2Zi+05BQC~yAL0G9AhN2ls?op^l$Rm@ZdCGHjt6vt(k2}2a zq_UNOjd3x|+=)3t11>{*QOvjc<+#lvf&vntl%y9s+W&ZgVH_`F4Gbv$zZ;?d z|MQ~%O}xk=ntfY+c&iPwDIY%3harwkk;qJld>E7S4VV1-2dnRx<`$fO|k2cJ`l!uczEU=dY?(AFc-Q{;VgCN{} z*zWeFeHfz4G(+Er-#y~P`+Ud|d7i8;3I1))=gozz z0Gc6pv;8*rW*>5aF#lP8jor;}<{>qJ=o|MT=T~rBh-|^`X5Zw)-?d@x****@1~gfo zGbz}2(#r_~VaUG?!z%q*7=Fu!eg50NYy9pTeE7FE%rYYK3^~S!Fyva{Fx+Op&3!P) zf8_taA+sy}Rrvp|K>gp-Apc)?O8Nf_b*pc~eikn-Rp2iwLo1 zNFXKYaXvk=-QZ^kVXlR`)hLU85$}%e&l2zlalD_j=j z;5;^Sak>%|WN&0xtsxv+NFkY|L5~yKAPNShQ@MMXfF1s?ZKLVf8uH zzOC^07fg3vtTz`ell4D2o>-!0K^_?Ai4JN52?}8bOGy6@f@8jJWy?%po5Cqi^7u~r zATam8wlBkE^v4Qialk75!~ges6QR$jA7VO%JKrDGh@H{}j^FM4Dsu=2~W)pi4zG{sw||pmYNih_X!) zjRT47XlZkc;{SScH8YM$rat|i+-V+UWsjgyXcq}>x_pyMT;viCxtp$AF|)9i`1vA0 zOs5?KR8xx>M^6ZSVY=nxbt_>`s3MCiMT+>$S~_L`1^I-|9|gEC)B)36#=I#wU<5-+ z7AX>`r=9fG1l`MCg1XV5HibKj1o?k}i=!Q5zVGw7322jk^tr#kB!){hL%$2KY7OsX8 z(@9h}1W~XAYF)GfV}m`jP`A?NxYi^=DLk~uI_!rm0@Q@d zG=ZW7YcN0QyM8c5-HMyVZO;{gmSU^82*%*KAc+-%#uN}$L+`#(QB0@nR^co(%XJOH z+QZO@)>}sWg`^TNH_O#T&aKLKF=j&F)EMVp$CfB*_DOLLdWXehPzXoPn z01UM$|4-`wzmoo?^Z?HPJ%RlHQ?>t_YoL%yH#t7O-+ce-9R|vYtiyYE4xS-EU+ym> zKp7yrRQD1nQUT-)ciS;t0XrrNBB6JOGHzxph@gRwYlvvBZe`3tPKSJP<14CLVP-RL z;hb-iFCG>cKqr8*;PUahmotYR*G%({%f?MyBLGuuOY_EA_^c>nEywGvWzFz=39^9J zU5>gJ12lQBaTFUcYw=~sYi!V(u3K5NP$uKLC}n_=nPkdbKvxN=DA)o-0+8!Q8(qG+ zZiURjOCQ<|n4uTj1Lu&~=O#7MpBRUX6x47zT(@fGFm*VL+Q9FczoHN+*09YljTK6` zz<`E|8bdrYjz*|^9dpQEV84+gr^{yNg5?f=Bd}SRzk{}=^K~m?7X6=d;5<5Nc3l%@ zCgs2xY_NhKD;(s1miqq;rT;R0fBFKP|9d3*=jd0XY?H`8-tdZtfWz$hHRMuHANY^I zYN36;vpr5|`l0yMcoTakFs?Qyi8E871|6D_ zceHL*%i{3k`Z04jsQ?B&x{OGQJsD!tdD#+lg~QJ)migg(;+6}*;<}0N_HdHr;v0a@ zzmnIE-aPeHMaw;LUxKqLj0`wPT1+Tw_s1{9PLZ0ed)0DyevZtw@F;&1z$pnjwz){h z8;M!|R=pe)#cno>Oo>x0g;r(E3RYtqv&dcniunK%7RhLVb>Zd9F_~fLqvmMbaRFWT z)UE4(eNnaKkRs$h!?QKB9Y3B*9Tsj%S z>DkrTdE%Zsm+pE%E-Y;X(m-@X|B$)q;KkG-=Ed~#N?Xk7RWJ9 zbYb`lpqx(HqL+_0ym&G28BV`2ABlUoRHX%~14JzuI)a7(5BL})9OccHXBt+*829ej z7OOqyY=)HGRbtr?oRwSYa0TCP!wMMVnPV-&4OAq~1t5EJ$9U&5=rdHX%(1zK6*7uq z$5x6dcFKdnW{gP^5w$j-H9i0b)d(Cg!LhK=uu{f20m$Z(stbNiqQlr2RzmnIkpLV@ zqyk8>vz_(v>HBZL_jxDoxnt?B-Lq+OC!Q?sJ@R~*HV6>@wAKDXZ zfm_^gQw0Z*PEcm?;3(bF215%CuT%{B1=no}-hqLb&{Q#vSz&)C^yf3Gq|#05I2$~p zOAW7Cq!p;d6~1R%K>_1#DAJvheb2_YsQDDC7B%m3vEgNl;Vrm|PB;tD+B7g%2jG3} z6gH#8E|j+*!)1`cztr&3#jpgoNODC?5Qy9pN=ncJl3OJCd%#T(C%S-Yu3J;acboKr#!Df;&lNQsC}rFE$JhHR_n~@Y?_1yMCa%e=b!{-H_T1KG1Xu zK=ifL+hHAiJXKA7F7?&N)A=KM47tVMO8+pE$*jw4%se@B)qk}2N0K@c?oo0BbNT!j z4Y~3=&q)*Pn#f;iKj@qCA@^|LKkNI3-OX}B2;a?pkMELmqnC3-c(UGuez#%6zGwOH zw|w|PAO6UO*-L$R!iOL6A-C4&)pE0ZmueMzxj#LZE%tGeQW(D4e$dBF9>QJDBjI80 zr}P7E&Ct7I!@dnZ9PlCMk??Q(I3tIL*`xM@>~H$;OE%2qe8>y)2J~@4Qy6l(Oc?%) z{B~kr_T@f&$cHr_e$9qCh8fS0yVvi&&WEq}VLc4N8+-5c;R|ipx5bB7`jE4(n5Fhj z`rX@o_<#@JOm8P zX^q@~;h9#YtQAZa(lf!&Y`hiWxltTX8hGpBhLt^u>xPdz5Y`8^%A|rWfO}A|Uhw>w z>&B->-aKqL_BSmyR@X2yL|pQ?J|QEL4<`|z2%e#;P5Jgx!)usTxS{gLl^55JY%%IQ zpO{tbFM%}%q(d|e>4w)btDzfj5UFAlhKvR1kbsrYgw_{;gtiTsYgip~JoCp4F!jR3 z_nJD}w`Bg<^i-zYyJ89rcG|0nLB7sO5f34KG>_ zuxAgCz}~GDtl%ajG_bZEMuS~SJ^67wQqY}`HLQGDLOJ7OYEI$m5vEr+QlNjt|6iRMN&gM%f1Z^3 zaB3#{HtPRR@%-QEh8I8u4VvA-LZX1L@BmQZYgO#z^u;S%l-}W#SnV(CkAMi3;fc7?#ii`swbXG^XgPe-vHk}@raYGrperA0SW$Ca z2nn14Q-ia|Hku+@MxRuAHfj~j3k|Daj;BXj;K`YoIs`yS=x>pb9w}Hz`4DJbW`6X; z4J%-dhqi=z95$HOwHQRrnnGLl^e}5nihG9}UbY;%esJEq@D|Fe2-^t?HRXjgua*Ol z0&7Rr3`m|xvV6Q@)yna_8F^;kMLe?ze=y+=-Ix9GDQniWula_TE)!;oCWsBW$t%}Mn$d=VVZ-qkB<4cHYL$b# zKXeo@q;Qf~?U2wTxubwX2jy&%Q;1CShSe)4dV`c%0qDXQ0Wpw#k~auXk5fg4APvIP zFEy-ESs=vW79)BUICy5;WcbUI!!3q#l+jIxIq4c!uqv${`^GeDcAF*atvkfa>meL45%+L)akxkfc+Y(ZQAAI?$bEAAakpC*-1(p9hNd8~L z=l@dw??v?gcwMw3k@^#F-rQ)een9=q*ujJ2mcgku7C4n~T`p8?&iWG|4^zI}C^Db} zx*Ta(@k6|L-gO|65#T%KR7WJYrFdRmAG3pA<#5&VLc>d!gZ9FHdKb_J(iklPxCwrG zLlJ1V1I2rbfKZ`t;#3_Y z-~#eCSgS+VMeqb_5MMOsvllLh;uGFlw=vv9ZvvIrO;SQ9riO?vS)0DOhLtRfXP(n% z63Eo80O0o8LoE{2bO0;Q0|dL(y26ey(A~ z%W>019v@V1d#ejUK6faM#`MVU9)WL1Ii(ja2kfNI1-soeGJvZrA^K{Q`eyivHIQIG zESxgP|AQL;e_{Gk=>H4o|M~XlU?QoX!p*}CtBX*jluBKVsx*>@r*)i%f^hd6Tb*`b z>+lLdbsPpv;1#fPh+xchv#-JAlhP2GK}JoGPv$K$E`Vs-Ab1RIWclWX7csJ`+k;G< z$z4XHs_KHp#vqOcci&BXUL3Dx$E(jZym~RX=Qw_8DxC8ypBnDDg!rXDIVl6^EDCs_ zc&XuqivdOU?w{JZ+srSg8-EFO7CmRWeF6qJB)nXd01yoHn;Txc7=um{%*{-q%C={;^xc|b8Xcrc$)PR7{`=ix=VbH<+aFA#=*<7Pj-6AFvJh~qHFp)ilR{UJRYb$zSz)ESAD~YmkZu&sHbvAu4KhjOTf$Lnu zY8OTLAfmK=!i9s`0E#8xDuYSF#}pSR(<23NR+urx!jXnmF0$~ssGDnA&Dv02g`IOb z0moCju0@2{kPZPpvkfm=3|?XG3nP>R#CBwm5kGwUzA)gk$P0(51gt||Yr_f_<0hU7 zeRZ_>z6Kkkz1Bh|K>rY&+5zpB8j1CaE;`MpqrhPkucHybOOyuDjxU&d3k|DR6u%K? zrOQV|E2stqW_B#;h)3# zf3JO<=l@POnkyhS1<`Ct3d){?UXLc|HhJLU#uB3vg!|R=y}t&!v&V z9>Ke017S|f(=$w(bJ`6xD0yyhcu3}6YERht<$q{ZGI;*#`0pz`6LIB)y1KX9!N>FF2g9VWo?4SBy!1#U4Q8ZI|5%2*JHjH0v?Qf7JiHDRVvg zfBqcD{}*un*K1Fy|HoXz3Lt`@2nV0bJ_4Th+HRtd!zkh4bK$U5|BDLfP`d#Z==Bc) z%h~sDudg&poZIjn^;(^Je_;ix-Lf9{GmYkwMQZ<#bFJNZAv2Q%Qa%7mYIdl}?t#Z3 zHEa-pg`hmoH>_e&G+ZtMFhQy^2+wbL4i`~E5rA+QUI6{u-3GOi#khWGww7)H9^O;} z@|CvWhk>6CN*pL@0>)y)%N1j%=$V$J3>a8viU!)Rw8?aLD3KBxqKrr}wqix$k_>-S zqLurCe+iob!+{dnM^6?r*lcv`z4l0`x4aLk$Gg{ zc*Cj`C6>YED$d6&?izDup4`!hU8de{7U(_Pu(HL#i9>@|BLn3EBt|9R8n@&C;=tR5nch0bc_sp9OM&U0#837D8yY`03bCY@Od=K-nTg=z1>FMIRLQ zTRzrkE?V5w%@ib{haTg6(HIOgfwr!Cqf#s~fD>3mjkJ=*IE%48P~PP#83~kjEQUI- z3|KAMY{Lo{88^}2dHtU zu;S4U1pwG!WU7k~woLiIlQ{N|&ili;f13Hbc6ILW$ufVD;X9wcJ$)}K2ws+6PCuA_ zYx=$EkEZ_|HHDJ-8-1-)?r-!xoIvpI%ttbx$vm9-V&)r}ADn`t@nk=t>_@g2@)JCq z*tv5&Kg7ey@v*7AB)cNlGSB&w+*vGtmM2YeN4}6L`TZ~%T95T{QY!y8`vtq3+v7v- z%f<`$a;j<=a*M$*%!c10MAFM01jF4I``!2Zkn>*o2Yu(;-9B#T7Vd@@qIgT+Q~d|> zICS^vewTA(!=LfH@i4pHevsv4*Kqe~b~m@yhyL5#aliXZKK!N+f5=0Edhg49_-j5~ z_TdM7$QiEeEa~Gedtvw?`$6BI*)Y4!huqtcf17=+-~D?V=C1MKt9;0**8FGrG~XrE z=-uJNXZY|tHtajihuj^JBNu(#crXmPkzW}8ll?Y3?n6$)-x`>Jut8xj zid|ANDAmx4nkChcTb9`TYJmah0w26X+y&;(jnf^Vy9BH`(rB(_rn3fdQmFe%&4y8R zkEpDpa*b@8p!!PxzkWLZ?*_#GpO?N6{=b`|A4Il#DD893`(4UQ-}=e8noAEHw-rEXLGwju5nQHWt1hC8U| zcn6xF38JvD;`Phn1-N+J1ctgVunU5+>>BA*JWkdBXvCoAMUeknDgS>c{c!qO>2p%Q zpV}LJ3-rHrHT^HFSiOVPYd2T>s1=20h>Mq`Y9GT1N_HAVGqS)zXIEAiJ1~b9R~#_R zEM&FAac>|gCMT?v#3KSK64shq@xtX0jpvY`AT_ZnmFQ}90A>2_h;!vaT`bqc~QltiTzXSb`h5o;f zr5{K?5&b`x(Esc8(b#JGPy9Z=;)M_)K*6$9fDJ({Bi&C5$1xEo2yobZ`R&crI*# zT|=!I2L9;CjnvTV?21({ieHP372(BHViAA>G&CGf%$@OvM~5E3JS3hktytk=T;Vs- zrnrqqHl9XqvqXhIz68_;J&hdXs&#B`_F7nq*s&F>WaMU7(gV0rj z54Ls5QG6aokcIzdR=frxgwQxb>=1VOED9ar;wt$Z5HCz!*5ES|ELXgMG1vrLLu-`d z53fcI3D)*GsI&k&-66Ogve4#Mta>rXpwPj{n5AwWP~139at3ffzA%58`Zu$yVQIx` z7vpkNBm~IC6n3Tj5TQ$yqqYRRGSJyI$zW>5>KNIvby0WRu?1M0=As;c;qPhJJ}=yf zfove!taLHt&a8@EYC;4a*VJ5i%MxRkE=8!gwZ!^Sd2Yoj7~|enOY2sO2juPfVJo%s zwgT|fE1C)h{@M?p;pCln&UxQ+&a*$?=Wvq??sRZdMZ>6B%_nE^)s<7!XmHe4aD^N8*;bry zuX5obb@h#MweoG!tXg23H%YU4n{ED`G*?bjO=M72aIBEuxZ+}al}jzDtN&oHe!@1N zvdwSW=67wA<7ujgU(3}>J8&hJW#Stu-)(QW%{Cvm&8#%5PP0u8ry+N&I2RaZZ5uRdX$_JyjRwpX9A%^%q2pQKr>mk^U$eSy8Y*EX-QO+FospP~A* z_A19g)m4rttLBSJ{_FFl?aoB+a>h961pDcY#jZhbDG7j9mBZ6iw;Io6yrp;V* zEY2dx=R(?>NI6b*2a8o2K+lN4ne|I>p7A&hz>WYN6ct7bRdEnO!8t|(1KK?z$Y!l% z1PxtM^^K#*2xtgBR81a#h^~Ey1|*?GL=p+ASxX|$MAynQ3?n@?K_!MFTLm-G?K{A= z*&t4s?h%V?CPi$KN+s3P1k1>(c4AjUi=0%PBG+A?bRX^>5ooja1+bnc`oD1_L0XGV z4ZmXntdX4}Akz?+CT$?LbHt*W16f|uy-@+k4=Bn2!qRze9;>2KjVBZ^H0~)uGi&{y z&lb~)1|C??47QDabfSkbdDwQ=;VZ4z9&v;JttJ28Io{LWtKk3p1oHo1aNg!1O}Eg$ zJtJc@DAhMdU@!`?wsGQTg}Dgt>5TIQPQp?ym{%V=1*Ry&zx z4x+~ZICM6Ab_3GeBjLUg!7CSxGg_tG4hB&13F3@242-KV&g4^+f9Z%|mwDlk8n&^m ztHl~_VriO%0|CJ>%ByK_=cvA>Nh(n99TDWR(w<8>^UwMgq-#Sr*m8i zc3sbiAeZ$ru;0~sw`A7^Or!}4q}g{sWtT=l0qqOmh}X2oIyl~NtDIj(L@6lQ(HLBAQTS-S)-gw9UrmiWwQInm0;D+jHkDL zk!WGZbZ~@7ID(83RSILzh#;7?|BvH6*7u@)3m8L|gAhg&#d~Orl5s8BsY?EDq58jT zx&GHu`2Ty{>A?SPDMbB~UfVO0kB3@P%3{bqt!zrWp1^Y#5JP&yM95mHGiU%D^7e=ZGMdgS=a)2v#;mhXpF&0{np|&co2y*+Aco+Ch(_ghm9n%v?;T z&Puq^@Gk1n$o~_k&eAI&K~zox7#WLT4(3YODYtZlYdFI!J^h6pYcV8Qm0N0)ofiEjQP!i+=5T06bB%Mo^qP{R6 z5E+UPx_|)pjtGc3s6a|U(*%$5Yfq7KWQm6CIdpVJ)(2bt73)A=L;DT$TF%GLtxQHEQp!-xISS>bFJVG zH$0a0jlymg&B&=H5L7sd6tS1Ccf{hE)v+d=KP>FUs!E2vV7o+4R4S6jpo4Bq;Cs(V zKBRd`DLc{iMgiT}y{;uIOoPTkPIRGFY(~Ul%>X+`ET%c&h?Q`Z;W*%CmJ`E?p0^Wa z87SD@6g8gcog)Hi4({>-!oxb~iBsnFEzeDTH$sEfP~Z{4GY4r@D9ErD>uY2tR>;V+ zBTyneSzr(!sLC{A0nG(xMs~ij#jqS>XGS&;VX&e&Tug;Zca8{d-Dj`Rssi%R> zC^TT4z5MhQLv2Ixf#dwa2oL+{4K)xV#D8`E-zJ6s{Q=^CRqj{ZL3fVxfU{{*SwH^E zzLBw5C_YtPvjIGk=HJ%eis?o*hl!H+WSSRe^08Px*wYqKy4 z3M83s1{-0MD_Y$>B1mQqt1nT9QCmY)-ovEvVY@>jO#s{ng;I&I23=SWX`&;7Y1V0? zt<9ZXE&2sO_v3Ur;z0pbL)H=f*6UJ65g51@&dh-f1xB~?BFdMs2(S>5i9^N2To6G6 z7@btnSoervnRPk<15x$rVzTv9LyMMyVD^oNV9BflXH*aRQEI>?BLZh;>IagEOeM>@ zqcb0?Rxf#jN3-Rs+*=!-nUe3XG*p+cVYw5XroEL}1L? z$Ou-y#8OJ|#YkqJ^Mbi4vfUA&Z$cdmH7~nI1jMX8JDjp+r(L9;+4tlrnK&bkRuv~< z2{kGCzlP{PhWdX;y?O4ZQ2+Oj&aKXx@gyF+vU@~uPdX8QN88rcE?F^497b$%#Mb%J zd)H^;sosS83_#EDXq4)24(90|5#ST|zo?|My|rbXb(>jrP3WA~ZN>C){mbg1e^lzD z>>0%U#v+&b@uhq7_;wM=7w8mveA&?yH#en*_lyW~nMF={DMy8+{D+woYzV8Iqj*Ds zT)<%eO~5P?-;RVY9m$6+<761BvZVD+undt3mSU(3V}UA5#G)FZlN&L=XJjmDne8|| zHzZt)Ibj42NT#4WQ8qPa;x{$w%%$BUV^PaNw=vkMes)a0)@?BWe0}4T{`~%9rs`Vv zh(#?cUN}Y(5*B4-1ijRxiV(_X!GXkcA3HE2h~?k`INJGQrydV&lcee=KLAJeDAng` z68H4(5er~e;c0#ot#M(dEd6T@gBbASZ-Pu4)TdLzPSHQ`KX>_Cz307mdG+pydjR== z_x>00Kifz0K@dwygRx>LE7lclwb5YVZoS)UsSFj8I*r)hIU*>Cpn7Q8jVM@#>4LK0 zU@fE`a^D!o?Dw7#fiG(#gFW<`lq`i3^Hw__YmEIqiH9CTz@QJ#ysf#@$0%q24!$L{o-UdVwl-aN~3JN8?D=`EG?g2hf zZmGQ^f@#)rkK;1d=9OJ(byMi-1!47e2o?KQ+^us&kj+X-Dj8D))*3K+=7?7Wlq9>2 zs9=v;X`}=QoY|xVAds;|Hj!}(Vrq1+AmNFtY0%WeRT7bG`pyvnGY6kq>tN_r+?a;1 zVIu{fTJtmR*TDaw!Hh*Ovu-54S|($91rHeOCbjcH%BW~CivGF&cLeo+UW5FYZ5&TGV~FZ*J=l zEzUThu!jSBuH&w~biCgZ#t@2UM0JrUq=;q(u&C`JmJp)%n;x-~Wltl3IpGN)luHj! zdJMu^k>bv*pcb|HxutnSvjMncQ)|vkTUoI#T&tT1X++&a0IBl);hkBFSR@paHf@C< z16x~947OCQGm&Y_eWSn=J$Se?D{w_kjC{14wd3Szt-3)0#j!43bc!<4=4iJABLY+m zCUwda8#@TIVHs28&LQ;@>r{A`E4PALzc|`7xHwLP>2z z4!O!LRP>MYe{SRR|E@v(kI%T5LjS-0<<$S{$yywQa-Fdp5b`uM16xfiLf}jj#OLJ! zRf3|yKy1$n27*@+c#)26+l`q4g3+^#j)m1gm9wiTjF0*?H9ui4X9dd0`Z>&t?d=`r zuxvcA<}5bR9n%a^P~hkyVJHADm;!zAtRNYK5pzwIR;94y1Nxk(cAK3V41nUonlO8^ z7RIP%p9Q_$iux5Wh9#Z}&H%LUfGt?xXlB1BD?moAOE5^!3VN%<**uA+!m(I81k8S+NJFAlI7V)=<)KL$QVe z#)e%61jEg5mAcTte; z11t>6bb(DO56=h&IU8N-f1E-UK&1Z1n3Mm;W(1JHxB+YMtl2^Sq5-=UJU}(ZhPK;y!!OG>F6GgPXa-(USF2U#94RuDOVm|r?zGLrwt2N}zSTA#k!Cg5)99qms$1<7TW9R9z*_>iM?$5;wPP>1?m4u+3)M?F1-)8*ZBgp@u`u{KE{J);8AfU8(2<8HjtT(o- zNw0#(0*8|oDnCsekPo<`0D7GOQg>wq0ma;VQ3<<>EcX@(WQG7+1PdJJDk27G`iJFD zK0qh|f@oIWRRs_eV1apl%V~+77fM*LPY>y%offg4tc5cx0nO4=8~vCH(Lhaz6ry?( zh`V}xKmeN{pp}34lB__Qwcng~l)Qmak03{_aD(*BtH~jJ){)JpP0I!GuVv7DN9RF6}|GxqJ z|7`ce?q=s_&KsPHfX%-*D;OtM(sVfp*~!+cXP<(iKLyG`SV{quvL0qEJqHeh&kD#% zyOda&)gwT6vOZ_MGw_}hRQwJOVO<@2vSX3TTuDvrL1Wg_J~M0!E~N>MQdhJ{Cqlq0 ztdq5}7O6~2MMcY7Tes?^vL*#yMi!00`Gr$u%m8pA;=n0TI}(1ff>YKBKN~u>by~!U z(KInLqH}^>6*cWhq!L#QCkEoukhqH)hKeNUs?*(B0W7n*zXWHx!rZr(i`~bT^~MUD z`=;|iImA6#0WE8HMX-Vau@E))SOwvZc!vV}*{(9xkkF;eVKrw3x6G5YsDw}Dl)y`X z=~`EG{luvjL^kR@;FwooIgBwDyc|5k2wX%qkbNEaTnby}c>{oubd01oYr)GZWn^>P z=H^blT`87kHfdm@>Yd_;WR0aE(SP+GC@v)ROBDSB|Mz~J|MOjr|9{cl>-^dI;LFed z>B$NZN^1d}qa%I_^L*I%Hg≫v5}*N-j$w1yDP)0)^7P9F8j3h?F%Ft+WWH=ZW-3 zzfqhMMYRQDd$R&$W&u%NvaX}KWt|AmK+>P3Cm88p-B+L(g=|O22=FS!Ui-2FWY&qs zT-{QOAZP$0f{Y6gK27BQPj(QMnjR8Fl%ogMgDk0RK`^uU7Y$#*PBlMgZ+KRkm28po4V7%{ zs^<0f21d@Qt6!3yb`YF=S`c%^Or8#n1>p$axi*~+V6 z;Gt?>AU9O5kY?33+x)6DtJx32Kdb&cU1hI)#eLGOnkUU_N17`m)Z{~UE3UQ8QE67* zE6u9q(yV5W2mh>^O<>jhDc`Vp-6h*9xO^%DYAQY;S1Z}H=Bt(a?A0$zv&vqr;sxM) ztG*#OR5#ituRPySos+98*_*>SstWaPU0rRPD&EI8aPv`VR?fA}4@$F&9U9z2)f#)X z%QinF&1%Lr^1am;+pE7<@_(lT?^_%4e_!XVa-VXKxO1IPI6DLS|6kth&I%w(o7Q7a zsL^a34Bcw>F{eNwDPdgjT$+OmVmq@1F;Q9}02kMC4!l>iRG3BM^Xe7PMbCk916iqO z5X`rK>U4Dp3^nqAg{htm++YEnThFCbe#K;pc#*6gm>vDjdk& zLBf~NW0-gn#Iv?*&2k$5u2 zAFQSayN`z922-}>_N*;tP+Cg1B~QK8WUOANyT<|t&&0J$3inz)tPEg)pgD^F?+)ny z-}bHq{_pc{!gZZHUylE8U)DmP)G6p}YsqFa&H%i$Ru3`502}_gIn$p=4JA`?Y2+KE zNEb7qIw)}#14T1it_)JGrK4-jKcL)Nl8H`YkfQU(I#b&so)rW$Z;hp;Y`jOGCgkbcdhgPk-?YEobT)c@2|vpZ{1%Zenq%(tKwOu!f- zNP7a%Kae>E6S>v%LpN{KnE;V+Z&nb?${kZ0OnAo(2@^EZ2s8=fZlZ*D5p;BpoQ!f= zR)EXeh6$GcwH(X(GkJl>Ctk}UlN{B4H|_u1K>2@d-Y;SQR|Ef_K>pwRoDF}0(BGc5 zASlJ2*gm&T7m+%~&Q%X7xfb&7fIa~fZsO0qS%E(3DQ4V^xE2iUV+r+U!L(0;n+Xon zB*$p%&RR&b63U!HBh1x2vz=n1*@;qUc&EUV-Y5sf?#T+GS%Rq!vkUvr;vf8_qV`_f<2?srf53;53e&s)h5;sbeCo<~ituDbFp zxmtOqZK}ZSwvMjtl^5EpY~gYbRb0qNHQVKes)wXmy~{T5L(fCcm3%@}sNf z4b+)xa?oEj@3L3frsu1buaT>jY{06k|0-9j_S)t_+kC_}{~*okQrl#ko;#~%YgjdZ z%{P$URB@wis(bk=hs#-AshlY{RI!RVnjcd7|0=5gaX$S2S9oPO|F_Het@CDQ)i~nXofVLyc1H5P z6eq1!_l-eC8tp`<*?}8zUU^f*)U@x*TA-s50>SeCR*f?8MwXKkDpZN(B^UZBXFh#k44xQegXsO@)*;EscA!Ql&s!oB5UPjhO;2EfFZ# zY6WA$S|Z>T=+HJCHKF9#-mH`>;33LY6>ZU20v%h6B2pODZr=juP62eP?20{EDO{j! za$akZXJ!PffGE!Zo=tFap;~LC7ShptB%~-#C)EqI&cfa)5yht4pzTN)pn^4pw7BQI zdH6wadN$qy#T~O_ix&h#zLCCbCarGHA`|$#Zx={Y5@r>B&1*DlSDdklV$AwY4NFOzEQ=~8y zSOrmtNWpGuFnd+e|GAF;9={3oe~x?e-G|%`)c<*(bM83$A9JB6n~#26qD*H|&TUA@ zP!yE&x=BrE>=2k(K*XI56$J~}l@<7-3JaCCY}?wo(MITG*$k;-y9C2RvTo?N32=Nx zK0C8xD;BWPEFM1d_@vtVGb2oX8ZhrEyo%S z2i}*Jq6NzKEn)Y9o+0!r4j79d#YUP?8rorCwrC4m+yCb%`Tqmpf6j0pLH!>G^ncD6 zav%F=JS!;3VEEI{u#k>fK|J#b!k?6U4ktfg;VSC9CoAwrZ8>jlZrRo$4n|}8pl6$} zk1@jc7X$&b7{UnkQG*oSot2^mL0v#Lx?M&iA;1#~S+z2|gwCM~hDt*0&gNGufS}&m zwQZ}o7tQ9thLmi5Owt5p=hX9~N|!B-oVCRY6talpOjaecy-KP9d{Fsu5McrY{Hetj zSCik9l|ltUJx2Ep?jlYd@;ZP7l>y5qN7)R*Dwz9zy*{c(;ry24QK3(4v}# zb=-pIiw4K2w?)RXQn(;!J?j;QUbYLjW9Mix&jKMWTh-1O`J1m>+l*3OHfyE5LIk11R~wmFU04`#$vl zGnxLU;r!pNV+sDme{av`;~#aDVjNnT{1ZlOU^m(Tkvt@o_hbbDsppw9>$DmW z^gtU-6m}xYppDP0lRbg~@B{|@w?Ng2*y@@p$LOp6sL}zgUAJW4&3aU!YyP!GnMC zly+uBwZ+z+Ff}STNDL;WdiI{Ilrqo^hI4>5^<#eYvx8QJ4^Wwh33GrI3&x>!BBys| zrI>+cF!}IY!`Op9YD`al=@NN*lrE`@A*yKfe<@_33XFRo*i9G1UL{Apg%hA-(U-S}df}61fPaemau&LgaceF$WWr zaF@qJesw*t?5NWT{l6zG5XhjaYqy?$e=MW~7?Ef>A(ow24(V zpaM^n!w3mNvQ;OjD*A7y{NHmR|F82_x?e{9k5iowJMAZ={{lDc%H@M0mntx%_ymmg zOV21PJ67A$`@D`0T!`?Yl!}>m=L8O^wj%0_uG==g5E|A})C&T1Otckw0DFGx&YZ1f zpup%Gnm4zu6I;O2ziDCnz;Cx>ObUm6{8|*}V>T1sle2{klp`lt$km4FEz{(_3#7ek zDUD~R(i13gr#*r>DPIt@N3{lnJtyMLI@VxM7qUm~^F!6BMX4Ay`#W=Eix_ahA>lJ7 zF&FfsmzKD4fr3MzQ9M1VF;Fom5jzszk&_|@EJL;aB~xz=45P-dB+1vmg3qlheuOX0 zN$~>im`iaj3#ajMgKVe^L_q#sQ+;} z?Eg;!|NlGZt>e%C+?TUhC-uU?7%i4vzc6;Q=1JJiO%umx?RrsSpR%c9@tnmw(IAUT zIAc>5EFcg>?Syk{!jvM-Rk7g!H`2t|lasOqOe;%OZ7yrr+Le=>8R8=o)aFwAnX47S zy`|2x-jlOs3zTZaS;E$05ig*fD`>ZqlOz0R*cXc4dva30pn!2sTA*RCW?8VsCpo`N zy#$ryYiQDvXJ^jVFwj*?h<3#IG`Cwov6f(>G2?HZkp<+}PR$LCgpkxRq+M z!@*1@JlWO^fy#F99U}w)L|IO17if;iOCa=VL=hfZ76b0-LQ7yb5nN}OSIrUk=4|N# zUgQ!sF7zT}TEv72ybe^O$&3qZROA(c$xxNL*q)r!F3|e_y6s!GZ57?oa2ERxq%sxM z|E=6W`WwW*N*7i15B!hG{|h1iuNU=y?|S+8pWQh@Lumz^<3eH+7NjILNfCkhV0Xba~8tP@~|}M!JtJ{ESP$g7JR!W0C!O=8L=vZ@V+c3C}y6eMJ2qzmbyfb zHtYu5vu@G_hA1?ruqpb-`Je9t{{Oq)tG&hU=OF)Ia^5rX`Ja6`!9B6(hH|wKrWdEY z@syJ%%LpMDoF@uQ(B6Q$kCUQR%Jc4=K%b233=v{etPSdhbZ&G)z%{#G3vgh8v-&;m>v)UV+ zxTseRom&;dy0{x&h8jcB3!HSVNOO7K;evJ)yn-GNv=l28TSZ1vPa1mC$Q$Z(sR!B866iVWAGDQ!vqp`NWLF-7}Ie{|=O;X`u#t_AGTXhv9 zj5A5?1fhStfU>#vk(n+v_(b#t&V@6zrp)4 z?Eea!|J(0QMg7m#0_J_;OYxjwAA*rU*(PS1Y4OxFV;jPIUhoV`nFw-IM3AVUmU354 z01%p5**KS(Fw!lLT2W|WtZ|;#z21mWvjo8$3^VF|m}i}fT1_H);xHpzILM|EO>uWl z@XK1%ahXKRYlMkgp@aeE{M|&+X!1e9jcf8mcIO1iTtJj!-bDaeT^B1*K$P0~LI08u zusbI>X2XjqWlC>z^e^niZurT>$nc!Q2YgW{_Qu zB>E=p1t3*m40^egRSoS#BYn;YDl-zUp)^C`DjIBTp#KIbI?$67__DUfI8#xCv#ic6aKp_XQ2-POpa9n^nNBMmN3==MI!7o;lN`FIQ8TN@(}d;>)nPI z)O)}ZCb8GTUjN_-b#%Iwl5D*>3r|$?nUPC+!{M=oQ5iJ@OE(Fyz-~L3(C}p_73R`h zK1#8?lz~6vqysjaOc>;ILEsNa2BK4pqTM+QQdATZ#LVGgCE{XsH0CH;NG-IFUJrMr zv2A;D7O1Ek82QC>i~>Ung;`;u_=2`=a0tx57H(ZRfhy|cE(VQQv7t#N_%c{#yQ6Kl zb$o2D@+I!c2}+T9p*{sge2Hd0pe>4hj!7?25Y_TRwp&c{Wq;1X6{#p~c_|;-YMHq( zLo+pOlovhJc`P|}MItj0PxS?w!Tdigavi{FCbY9RC%DC+Q&;pO%WSRgPnoI(l8l0L zRU4I4Bb5B#?)bO+t-$}@S7dY zJJ+`E(EVdE#nd&@6z>#FV-Tjp1+~*c+IYfLQqXo$rTv<)Bu*qcRjl_d$4U(OB zW$6Xz&;;d<>dFb4QL_Y|dHn*Id66c@sYEg$z!L1lz*&kgvQneFa~8{}#1(sxtdm4M z0aif;w;%68k_|)WCDfOe4|WC%Waw4vTaUAl7uVpN)4 z3C9}; z^7Qf(mosXV)j{A5Do~9?zipHc;nUm*MzhU!RzjJ5|5ghWNn`c_X>KPpnt6~0$=B%1 z306_NFW7CPXVmUtJEOP;qj@5?jhlHZYk&X4VK0Hd$&L z#sI*z!H9=lIl(P5HKKa8@S`2!5Y~0z} z&RTcD`eUt6fNteih%}Lxo+E$Ta{^stir4j>HEF_iChifV(cl{5mSfdg^ozPn^%B_H zlM}ci>ySuV+Pr>Ko7TwlXi`)!JpSsB6)5ebS)m#N$ZO1MIJQ4$5sRz^l&}^c4{r5F zL!u!66BGis>wtGbq7<9xyK;hA)Rr$7WE0ERsH%C|aAZ9GJ=i%SB+MGM{$EM?|7*N& zdc)ovod3JU`KfcAQyHZH?wq7MYc|xfZOaxjoghPr*VtvEvTcpyj)Am~0nQH}IdN#n zMw{!bWMh7%%z#9cZHLt=2$`|;$g?0rUT$dl%G+sE&Gxa8J&n zm(+d=LL|U)#k@0X0veQmbSg3kgx7CiGv6lc@DR>CFj*DVXPK1(C1<^Ddy& z`j@ecD0D~X3#r}MofAY8zXcNM$>g#QC_M@cA?-ZD@?f4OQp~A<2^47KsJ|p9peDs` zN*LX)c>*5TPQJVj<^JTM+wBBJP(NQOxUeV$%%r2QjPMYP!bmqTGCTd~xq$1{E-pAJWMU?8?dJ6lpd{_k*xp<|j!B&!YY{4TW-O-x8z_{a z8|**QKpTh)FYL-$BoiAiumDh5NRt4TQEV==fxzD)<0}gZ{R0XoC8`Pk-|T{W54bzr z*vmuwyK#5ZUsCbkz0hCdxBg$K_ZL)H{+eyVTC*c>B_rpVEw5ZnSJ|t)@@#uU$X-27 zu2%ntYNB>;#bVohr)_fC050xZ@uFOQ77qI(@eZ(#$%87fU6`gN!Knc>Ramr z9w_i97{;K(Qg;odLR?Blc(Su+yk2Cd1+joI0L!SZ~Dih z*B1&b2A@9ybdg!w%W{HWRGOV~@>ru%FDUd=+4Y2}8|UN+zJcH`6#b(l-`~Oh|5y0` zmLUJ98~MNQaG<0V`WMd$;6VrbgLNCAUut#48YpN%U!JUP17N3soYex=re?J}HwN=i z%9sZ+EbOWos!^M5T*{nGD*C6i8P$DXPGE}S+Cs4@AkORi4&QFqePnI$kM$z zi&`Y2r0kitmQ7am)awP>7aJXlTS4%W41pXe>v-Oi6WF3=x$Uj+LWyh0hCht$LQcU# z`9GF2$saE#qwdWKd{KGPRLsKi6>WoJQwxov{zAc+MR16~0k=5;Fb2&p>+_ZEWH=X@ z)&;h=?H&NK7}6sZhCbc7L{;4RN-5OEGbT*#0R!35*Q2BLxn&>-%Tuz;9{`& z#ej=JcMP>$Sgw&BnETqot7}PJS4_`7wv8~C0O_B|D~4ByQY8#U z3L^jS^4EFKc{h4B?h|gtEq3nvi{*d!sNf-jsZe&Wi2Y{foM(E%R46)x5&>x=Nqa^G z2@#wO*(lbKvu^K+65eI6P@T~x9Oj~&4f}Ey&q#i$C8g~hZCl$!39viF>_yUQoT=Y# zFXWdJlEomX2vDc%gItmmNTW8TgE;}#HJEoEJ+zoY#XvDdfVz>Xi+lr^q87=h_zfqE ziL5h;%+_lHZe3qESxj~$28apc+?^9BBYR^IUu^5A9uaH^MB)`0)b#rx~PQnT*ZB3 zL;Xf|1EZ~*SihCWMC2SkN?N<{&QS}3Q18#+d|A7o^vq-7kBvD!7g<#x7ibzWdHtT-xzBM8%{hqghLr0;R3EW zO2keZdiSUWE2{h-23-iTTLLr_Px4|C&;@u2QkUR;Cg2Iq8XC2LMdf`CCV5*@hfouO zp-}Hc;Xhee0!Jf@iL8p)u2BIk22-&0OMps5sR&qI;qfWhmN0>x(OP6IK5FrbNk8Cp+cS z9VldD{0&_rw+q*USjo;9wqsUunMgh|s)GG8s@cK!Hg|MwtaznuzQZ=3kY?pV+hh+S z_fW~zJ5_VHz2QT)dB1J`lWl%enpL*5D)!!SXI1Q!Qcdr{R;y>A9;yR3yxZRU58T|?*40wM{y(1T z3U*y`vr;`7-B8JHICb?$^0P`+dy{Ucnl4wX`fO886yNZ;z4}Aj{H-*r58Ea?=hVtC z;Hzz$w`{69W}6?g%`Zu_`nYYr#x`%W%|COKN&r;cB+W|o#&or6P_9;2+U8N)ywx^e zQ1X9`vi~Xnhx~sB;Q#x8vu1KCJTPj}PlbZrMn#4OC}s+@&6gAGj!~LRq!wzYN~7%= zwGb%9$r&taWt}+wj4TB=j1~rqYEi*Mpp1hN(z{0m+Z^;0i8W`~H+hGYjzJ8!K>RG& zKi~^tUC5++)WVuo$|4CPn;Kvxozdp_6(%}U1dmTpG{G|M9Th~gN^U4&y3}eIObIK8 zMC!pwH0gnKJO;|JCj0TOiH|KwV{_h0-=Vz$@vjX*h_9Fg&`-$kkZ&Z*^;zR=qP%j+pSn;fy z_lJ6gxb{Q}qMc@(ej1hvaeGDu0i{gNQZA>dhryeRT5ggLK{%75xG@6+q&FUrU890t zX1B#6a}XhGF!3KNyiGTvlWKm zzj^KjJNvN3=ww7S`@2R3#>{;$Rej488G(VP)$4%uogllIpPP>ViD++>lK(A^e>dv? z(D^^*$p78xy3QR=%jEK3zU>~h*eA9`RZ_4pLbE5Zm?C>%-xf#;mMwzZlR7|k$oP+S zk6PT5GITk!MPA?FDq)vf5`y5FD6@rftZHIX9&-DrfSH4VKixf?H?kLu3>_oaWVfN) z2=OhoYVlD)FY7P~S6mm$H;x5RzVL3yA9v236Q>*E(aCusr=#p16$EooX%VS!W*%dR zbS8|>xT%qyNBx8O>UZcK6%aG`U#`M1BJ)kCC)hu-GRIdgunQZmiNS-Rau|1y3VKKB+(Gt8(;;K+uA)k2EAOuIjfd2>ivQRm60H!3goQH^AmC& zMc4_F8aps*!OH;!*zSAVy{37Zr^yvySqKaiX_UjUFBugav-XPy50Jtp72ar;94r9A z*F2xGY*d;fqt+?Z*+BeorBL=9k~f6{^k1f{j0V2xOGYiCza1EddlYr#Z%nFNesVb&d^ z0$^q)u&9I&rPNDlw>MhCzDfHRB{bNrDXp-5R1nKS&LUFNObj-WDDxKQ-K;o$_ z+1fWMU}dd%arTO3h?--Ob6-pqc;+U`3k?o~B{C_0`$jEfSvde1A*mnVniQZOnRd9( zCM?7xGz0*B9cYM|d(WuFEi3(q>x>JD8tx0}EZ!~P+vmKud3bOrlZ@;C1tD}`k`Vj# zQUhSms6dy4hJYngSy7V!NE27c5U_86Kwv#8J*fS8*=Rm?8MVur5f;(wVF>^er3rvt z-~|pDu)7EaUR3wt?omN5YaSd-Pqk}oXNY9h#K8rg9#|Lp;T8Q~MEd_m?e%YqDjeq+?U;>0)pasE-&H3aKs)kJc|71YFjdy7AUwb8xjzA0V?eo&BsA4QKcw^ znyeLP^j+4Z3#3~IyRWT7KDTl*>=_kEGqagR>M(F?XvhW(EaOC~dT8PNZ zwHD3ZA<;C9_a74^TM{1ieEm~8Mi{rL*3`M!H#!E*j8gG7p#fV^GlF0&3asWtXT@W$ zARbL=`w-Z%oum0+X07Ae3DS%nqDMbJF^MrcuB9P_p&KaLz&w8MsGym(4a50Mnn;6I zp3!mXTEYA!J43Kxq97xsk9Ch)JafR0u5}quj|iuL8i^4m@}pyJV8>|uN(755SZ2Mr z`4ZY}O8Y7#wI`C$)U_l4?HaXsW|jZTt|QGOiI*sHvK9>Q{Bf?M;KbCz|H2HI=zqHN zbH{(LUl08M5b!_ux*KufZ}8vFQGq4%8bMQO?&`AHGA4yBk3&J<%!{MSECQ$p4ob@cp!2)|!ZCyO>mLTmhII8(SY&8XJsrVG8Kn z_kV>?cZL6w{{lDv25JA~E1jHylQY0G;4VXDe|IV1y>4hO$^U82QpZ{9-snEe&3NF2$e`-Xdm2F?H7MJ*kz&0VdbuI9CyTSMk@sIquQ zDAcZQZd(^>+uGH-p|vA~e7Y^o9XmstT6c!FZtDtd-M)Eqs4uZUK0GiK3ZEVL(bo9k zM5wFvQrt84zKROIv2*yyk%43)W4q_eE%Bj5e>!t~%;k%R<2Z19=y-b~vptm@3gM~8 zj!f6vGs)frf61NErNOpT=TN%$5I>E*x-GRW)0fEDs~w3nUD%vBniw!I%(t&g4)&($ zwDaLapZQ|^TZM~fRJF~UI)8q-cPN?aOI+R?A4>L_33bc$JhyFK*LrD)zYA^K8kq3F zdpCEsRBbwa>in{D?=W{Yh^Y$nwK%UY^<{o%fw`s5E}GBJr8+y3!qUidEy?SPzsv7R zZvtLV>g(#c3#QF4EAy^#c|&Cq{mFDneY$7mZ6k@;#ndFfn zj56VV!qjgq!+e!_$9TT5j`)#&sEWKdRA136n#UVI48P`?3z=@NDdX21JdiwcB#{|3 z|930%Ue#PyFWaeZ{>$FBC4KlvJazoUbklwyol>NQ*CzZQ3iCMrmEM#7Z~Y(mU-v)f z-{N26AN2eDJ^p(Cbbpp#4v zjsQXM2k+-z*1HXM!~w6?f8HPUZ}hMCYy3*@KM-3?c^COF`d{!r;Xi#^N|5Crh z-|S!LNBuMW8Q!!0xBU9>*#Yz3%A$u^=7_uA$?A}fUlg-pXc%Cx%63d4!76v zXA^x+Z=}y@4g6V8pI(gHQTlZ2=(DJnuSDq63)AP+)qK5%udL$s+4MPOC10tg`1 zuH?@OzH%0QPFq2rQ_kei<$Qe^eHJa{c8ET`CEQ-jpXK~{247#qp9}f3j6RDN(C5_o z^y!|?*XPmal)3ylhp)`0 &KSu~5=CGrb8U~&F%RtG*GiHEm{0I2KufY+X1^0LceBnvZ^`lJL_cIr{P4ki0 zgEw3Oo{<9AV2%R1zesbN2~bG?0|?>&(MOh$xNst-Iq!nuNe$&iDwSS2jYDR zXNs=JckYqiLHy@9^>b#T5{X;JKk7=r_=N+Y8vt?wZt>2c;+aXddYs6TaJf%d=vnxF~d}q&U99o+nWc-+TSufG?Y#`Q*}w2 zrRLT%XU%jLnOocAM+eeJ<4zH3;^5q>aEZEWhEr7%=x{?Kl}Lp;52S~W4?9zFQUr~C znt9Zvr_FTcnGUE+_# z#9$iJn(93OuSaNeJk%Z^97<>6cpc@f4wYjzB!?RDB>8vyzZb`z14Q)#AON6#24-Gp-O)7G+(cIlIo!3|O zh?DP!4jfCT`vyZTnRsenB9l2D>WmNfCLB+nO}ote@Z4!LolRz#?Wx`YY=-ncY^H6Q z{&*_c8(No1!m-kxh-1B{=#=O(_3If<)6|(xtNHZ?jMaBIj^D0LA0JGZagSsY@jk4D z3c2gGD1$mN(>cfdwBfSPEnHN}~mIHD0 z=jl^VOU*q?-N1gsJxOdywJBzq=~49G<@iq`0(cbm{w$mV@?q~)-gKO=CNzXqEScwt%YflKsZW1`@{; zA-D*Khj4S={FXS?%K}T<86SMbaD1ruK&W{DPpgYaoNAtR`BLULiUV#)B!@6{*d+W$ zp1NtSvpO`>iJ0dc&(J~kDsOU;d9j)$Go97u2OH9v{&eaJu+&gjVj!7HV}8{DGtB_C zi)T6w=6=v=->PkcL*Ot&2NQz_5*gaKQ$Z*)`y2?P@5;sW~I?XdUsvL6A0>Kq7M}6USsuMev?71Hhv?i2i>FF9ez5MHR?;h5Er_C%kZ`Q)k|Vh&G-f+C7{^0}M0ecmTrJB627^Em{_! z`K`lShg;&It;6wEThpjJIJBxIlQ>L!QkDPEE4SFGS-=mbS8g~CHWP=4O$~t;Cwn0@ zR3>$id66^c&veQSm+u-*r7%l<&Q!J0v}7xD!l&mw{oqi1KX}ikRJ`|4f`8!Vb8Y-$ zUf>sbg0~YMXyWtvY-EZ<^gqvOcKpZu>-^n*t$zyS|Hn}WpdX&TBKN!Qr`)#z4^)SY zz^9zsoD^=&|F`nIAT=a2=_8@O8cYCU1&)sd6%v38)O(jXHRlEvyajIL!{Gcwp>}xj zGwC76$9WJWh0ZYZ6gg+66Eo}A5eMrZ0=>7ShckVkWW)@dB3(OJ#V4s=`4}WfrlPS#xn_L zn$kO_s=1lrEQ_Tp5%pN74tdb@%U2K>3X-=~JObFLTyZ&vZ7Jjou0F z89$PSQj!X7OdmRw#Kf*=9cK%EJBIl<&N)@AAE_t52+RRYVr$}9s5RA3Ck=#J2I7ZF zkv@jt6irV(9#K!v42S%GE1dsyyee;vx7oeNi+e}C>%F&n@A2;Up7Iu<8qjauW!^8m zKe|uDrx)^@{dTw3@AohF-{Ri`KmMcsH~bfz|8zIFv)pUlgon}r|BL?3@>jT<45L=r|{R($;8Z(#Nj~EG5^ovUT{zC&CFPJuaYi~waRAGZ}U{Qv!?s=Fjze4p5o7^MylWA zUye}+D?)xNz7DA3W0dNmMgBSYH&|VL%1nQetM#g-^gcmrt%PQHoO-l`#+%G)n0lJO zly1;^*GZI=`<~DhRvY;7|>78FR8eniTox1kS2!PYJl8wl`LoyI4R|*=A9EMDk9i+-f8agnebIfV^St+O?)^^A ztMOj+Pj##P<$kN*m50)X)$N-4L;eePlHbt|Q{UBzgES zybYoLVW=ma3H&i|2!{|R1}>z9-+|b5Vii&*aQ_9f{VKN$HcldhXB!;u%_PpJOHkGV zn$vmw1_kt;bLifD1*M6G2x=4!M7Ui>Z>XoWX7wOO1T|Jv*Ag=@0y#o&ohMFLQ(q!A zYiO?pWaFwi{z`X@;eQG-l!9i%;>CV5eKUdKKbFFwLT9p&`Bw=+Lt){Uj<`b!$z+Ww03Hlgrs4k&yV zi+~U1Mggwe5KvYF3JA{QDLzFn- zbwLAmJhx@No%DNIo%)u5H*`W340Ducvd?hp*9Lzl>em?M4C5(dNxOUJI_EXdbha2x z{X}XT&s`YLD|1(WVPMz^#RlA%%0ktaFzm+*0-G=>P@HM`PLCRU<9PmE4l@4kIyr$SXW--v{Lh<#YQM-?)wCWF2_$PExdcc8xFfokRmQ?~RiRic zwyFsQy}OrnXS!20Zjn>f3Xe^q?|7*7a`>DE2Ltytn)_-`>0U*x@PBv)+*PL|+ZRPq9Czh(lK)ekTagItZSu?g?a%^l{Xab3f3ds$A;wQ#U9Mna z$=(A)iOW&*Mg8B6<>9ByWrd%Dcm49A5PdNIj{mG3^LHKp4FuFR>laO%zhsH`+MNoh zrBQ{01dAhh;h!xHTD?rs=NEo6NvBYC600tpwj>^yj3AQH=zZAH5u` zAHRs2i~zuH9LSX5nDymT=eI5Q9EG8L#Xxc>u@{L+NOb@_b8q0;_eKJLxZy2}0he5^ zv6loB>!@GSeEI zA?lmxf4Wod0Nt|ye*chrox8-j1sCYwFxbO+D`FK(ix-tv6_-M*=uO54u&GQk?%AQu zLwz;v2|P~dk|aXmsZL5K4Rrt?nm~T#5VClWCTg2Po1m~DE#Z>*ah0k{TVhKj8rsmg zZu_RnNPR@e({|76~(1n;>U*%Cu;`P|3ljjq|){w@?W~C7J(a`;ztvGnK-mQ1ldB(eSqsG zQ6(#mS8m}u=w3_^l*s6|qsW;}HxCXCV>$-wkOJ4xc_f}pRW>zZDViEX4fUZ|v^#US z2urbI^#wEmc&@JWq2uXL7qZpB7d${hu%Y*5TK>}apF1HJMlgu zkQ7pHhBHSF951x#8o~{sZI|yy{$i-353`jDHD~svGh5nlxNJCzx}=qL5v@JP8tP*9 zue!QuQ+MVHuh_v^hE>byIf_dupJrQT02w*70F=hN4(XHq2Zjba58%-fAc*i;t{^s~9S0k7OZPlDOd`@gZawmWkWR(aK`NL864yVlFoNFoev zPQGF|**8cDvdBi^G&tHL?Ze1qj1LB=Alig5_5df=fe;W=>Px3uTOy&TqO}H1YbczH zv55YsA+aAQ-BW<+o#CdOf5)Hy4gdN|ik+1!R<9^8o>#UUGoH>29zt$@0wNgytwri^ zBD5npkVy88+iM%+5QImO+La2$I+2!h6v;ePO$&V-iyyBHSJkd+iq)ZROLykV(~6yQ zmc~{tDxN=o#fsAPY2XnkixdrTl4NMGCQ~y|(>egk0;LQl3vI0(V1kLzI;3|d&JH!i z5ROkE^N;pbxD6r|1ID7!s!%-&Gl8GzHvYo)E-Nl}c2=~kDleYD2*cw6IlXq(dY~H) zgf`;Y69a=tQNy0Xh4}uV(BXX>JJCPV+rcuyQo$KAec1XSYI^8IvOfj(M~rX~*$@W~ zXA*s&%@E3D#ao6iKS0k`+YoJN+>pSVrtoa2x`iFk*bu?9NgI@Y^^{YKoo&loE0)l+ z6_>UT3=ds_o;D};B~pWjlh|?t{h4(9Fb2a?G;hGDn6l8?L^9QesQ~bTF!o?B>T!5S z_GfC=B9{(V2NH=;EFuXT^rD@anvvOo9NrXI@8+&`&B$d! zLP=;{GJZwiJ(c`vK3Ws%!+n9D;4EllN_WQ7p?2h}rm-1n*Jk2ZBnK)ZiVj23`Y47! zdP*@8;g_#0FD@@5k+(LG=Nm$44PYDe7BDil8PhtnDL#;n_kjZsK`ch6%B{RsK8zxo1xwn^;(g1(kf&6fY$52P|VCq<+ zKU7;wJ@my7H{oAs*RHJzigHlu<6tFH&ZDuaPz2Qh18vNAYF@Fkw5sBQvf_D*%2B@Q zIP!UpQ@-ccBq&g*EpJ!Zn?j&hj##}oKpqPKSd zLXFbrUjc;EhT-E_PauoZeW2{TMXANoX1| zYVASb%+zD#Ykg}o$R9&4*-@yYsZecQ1hA0aLzvmaoj6snE)-C?=SM+?D_6H+;ZopzasTd-u2Zp%fSb$ zBC9IO7L`H&gM^Dy_P$0GU?vDuF%a629tIX*Ja33Z8$%hqJ?|g-s7m`8xE`eSciiMaM)90O}Ji~ zF_;~P78N^@s*2T66G#`bDZYTA98JWBFNf%XaRVKc#Bm~@AZpd98*4&4(#R@IZGj7+ z7e9i;H{&+OYGMsU17Ttq(-syxu~l_Vq!Y2Z1;+sNS!6njLS*tHp;-?1C3}+v6kTXV zcvGZMf`6vT^f)^diPh1gWm4%za6_XUHA2|e$D$3Wpj#QXf8a@m%Zi;PD_6(LY4OS0 zf+~@OQF#&c?p5FcNT(jY0xvYy?yJRdSOTfd&sw$nP!v5{8PEWJ zQMGc#3g|)D1Do*DhmxUf$7vIVHYSpX4gt}V($$slh-?AF5*&h+IW!EBw>ggd@k9!Y zZzvw4Ls`}*0c%V3RYDhrNDMc{>bo=K|9AbD=rhXyo18vRetU8TPR_vJ$_%)5t0?~` z=05MB^5@S{`{!SP1O9^lDgS=d{CTf`GrR(?_J>gGr^nxcI$dl1M%4H@(_e`CK2yCv zp|;O+KnrKRuXv9DGx#Cz4%G9x(R(dw`5f`~qcT_r&I>#rnZ(sz$UEIT)$`mxV5pP- z{@Z4NumDZu|B9&=it0yo3-&m-V&VF5t!~Al5#0(mhPeeX9$T$iVH|7BtuRi+SVgTy zoT?HzTeZTG=t^$kM3km#)j~0UMxMY-i8WQywT2k%vkGq2Hbm;rqE8RRofVAD&tlp8m?c!t#Dnmem=G6l$lya;lN7~iOl0`(B$goax08?pF^z( z6z#g%suitmEaeuekcVe+D*{(c3Ae)Gy2jIVE7DXIsq+BBV8wK%+bnrcNFqf>ROu4#&HMe2*Vh2u2pP}mb=L>lVCo@&J!BV7M0 z<~{15E?=|K$bh|9M>h%L~;1^SJ(($MwHFuK(q6{jVaf|5e2Gzlym2m&f(LJg)!c zbNw%$>wo!N|I6q4Uq09W^11$(&-K52uK(q7{jVaf|5X&I|5wEIzlym2m&^6PT(1A+ za{Vut>wo!N|I6k2UoO}Ga=HGO%k{rpuK(q7{V$j6fB9Vh%jf!EF4zBZx&D{S^}k%M z|K)Q1FPH0oxr+YX)sB~Qf8o8||FOHl^Sy3p0T1|(xP#vF-W>Ozy?=$={sHQNhP^lV zPkX=jmiX`T?)1-dZ}#f^w10_zkw4e_41i*v_ut^(>0Rue1MQ#%$e~`h%e~!u+`7fWW;P5KB9PE8W3Zu!ZBDq!!L8;mV}e8ikf75BFx8E$x}60 zLC*gd0%VW=j~q8?igV5t7|3Ih0T1ZEwfgHS8n0z-*G2Apn5!U_dOeIPlwoFIY} zcI96$qmEIj0o4GO(&MZhNT(0)hflSS&EUZhL)9|r<4gEGC?lP}T}-3GKJ@qq@d$J172q|6DLTZ2J zi6UB=p;`0?V#@>gS)zpgAYbdwbmkD_@XQ~@)L&~KIWkVAakr$A4FNytvD8fZ261yt z{S5l19i0vyra3uz(Y&*Y<}Y_~ z+*PDLu=$HhSJ2q3gK8S^%FZmBzY>?AjE*4%Z{Bk1gtgNEMfh`;70q9Q%TQH?F#K6d z=@DY2wJQ4X7l!DiSbH5yCjMzlissM5chG0MKrQ~<#WYj+yCKGT+)OlnX*oS@lr&sT zJN}$AXlz6uYHNjr{JD$x*QE7YN^(mU7R}chFcVZ!X&H4_M~bkftD@NpisqNQb)*q@ zYVs;7ozJ(CZmg-SX!hxJ8!O3JA11b<)8^4Du)2((*>QL7TzUuuBg1u;^iVN~p0}11 z=nlBbnF8HevuUnamsW)6o?c2jDAEL-x;;RT{_I&aFrD)gHe~6}F5zpWYa8lxXP?H` zNb5Fq>CP_J*CI`FZPuwYGHc?BWZk(l>9ND4kz2}jXU*XINIO>q?9M%f?;|bU(y>2l zI^PEa1)GP+*`GU&?<36}&O1%j?wqMK4TzgGMiC!W#0^bAU#x2q8h2+EagVhTY+Mev zxO05IjdXmWc(>G}MPhYd6TUm!rS}a-p!es||8#$cCejjBsCFyv2Z(PXoTU^>Z~p3{`4ukC5NAms-FNLb+s zl|}&dzq+Yy;W?xC-S*X^4}bC%S7r{cFM9uFDJL>#`QulH{{7!GzpC6^dHTNlZ+Y~e z=5Bf8Jr&Wl%bvca=T+hD?`>Kz?=_(hz4q?r{Y!56R{QcZ$VJD0!KdFIx8F1%;W6}@%yuG;hB?JHMw-1qHIZd*O| z?XUj&cXvPZuCBLs_2w4M800MoqJaO?8 zcdl(*w<5A{t`j-)O;6o?*TLBrZ#?^*Up@HhZQJkv+QOyReQwEj9=ZIi!(XdA?ZSWh z>By$G-+#M!`DJ%xXV(7wl>67sax0rJF8kh%7hn6Uk2G8rdib`RXS{Un^TX3$`rJ)N z>Wz3d2rLFhwy7ZH8uRML$*N;7O-lspg>%yL8vp&4O@z;;PskZ8p zPxQWT-|#0EmK|+--S+Q3mCI~@+kYJT#gR|%sp>5{de4;NzKc3OyI|S!A6FI4`rgrd z-g{=x^e=y8_U6}J<=u3izdEsQ<3*qS;~Q7bxwqwDq_XIt=oRlMU$ry*V(K@^Cx0;i zj|($3A2_!;y7$^CAHMOxPgid{c-wuKK6KUZ4jwx6maCfAhGzNK|H~VmykYy9Z@vDG zkNoE^pZL^m=fD5vsc$^e_rZTYzToxef8dV~Fa7K+po_Fs%J8y~hPC4_w z8?Q`0RDIfxZTC-r``@Yn;a`7cU zzSjLp%`eU@TlVapi(c{Iv(KE7eD0M`UG%2A&w2D4fBwM1=PFPC<$V{w?eXu-><+y$ z{e?BtpT2DGxv#(P{HNPK^0{~95w|dX{t8TdA`uKxyJ^0&QZHJH6z3}3W z`+k@B;nVj$Ue~^{_*-|5RC<5E?S1Dwda3*UtA6%}Ju|kCzUJTlrTCqHzU_w_uX!f@ z(m$R)a_c!C`S{bVFC2Z~r3)YSetyd<7ya(m7cYu^pN#mUwY=_vp(?1p+$SDckh1l z8JD!ZGO_K9D}Hp>_62Y1K5ywIR}OvP;_c4!i@*7byUsuS+UIW@{HO2TwDb0_{Lo+X zZ0h=jnPdOn^u`N6ynpD2=luPfe)HKs&)pFD^~Jfb-tv|5%73YP=@)nYbn$m*Y+u*+ zd+(udKD?&8`<^?xrnmI8@7Q|xJ^uFgH?MpDMd!Zx(z>PV?%e;?So8N@x!{ovXMW}S z$FeK`{*G<8%(&!Fx4kX=;H%zyW&NZ7wsgbqs@hMv`U|K1Yu61omPhvfu6^Ef58nB} zo1(Ly%gy@8iGy74)c)|ggYWIwb=f@^)y`?#|Ia_V;?N_1>RH_U)PgtuxZ~!# zzaM^JpgME3Zq8e0e>XZZ{noOw{iodjqaU@_{P92}ee<*5{mx6>S8OaVy>#R&eb3zU zh5ZlS_O%~>ddC+=&VHn+h8;D-8a})^@ex9`yI7KBY*0t?zttj z?w-$gzjEi4($7EhSfahP=e}jzzj(`xtG;vaZP#5HzToTE-+uY8Zol!`d#aCg9$we* ztu5ai9{KWJcd!5Ex!Kv@`O&q1?7QaaizD@iTP~eFyX}eh&U*aoAO6?5*T3?{o8Nlg z%~$^UTPqK}=ktR%FL>acpWjk-%a@0qUwixd_KuFLKfdLbj_zl#Yk214@l#vg_u%h~ zR-F3VqPy=dAKm@rXCMCZTVDP2!)sIj@YTL>+mm1Dn%n-wt)-S7w2EM z?w|JEU3L70SA1$t-!E=jUvz!X+rNJAYaflh@TpIK;NLF%?eWj<+H&`nk?8ZspL=lG ztjc=^y7s-L@;{z?>dprre6WA@?-nlaK3sFd@2l>ude143ExP^YwfBDKr6(%Sdez%z zzk7S@>qfEPnJG*#lvs= z#l4SBxv#Ql*DJSAe}DBY9d75~*Z!^X^sw8t?Dwxb)`}+2MJBDNPnbg`Ljj~VJolS^$cN1Y zBN9+PTOvwE4$e5E>cO z?66XWi|bHcEOV%PpF}miip;|3EJ&#x*`2C{?>N2EjzjS@wLSS@4fp& z7NeR)v^P#}+`j$MkN*M+2^YcQ`SY{qU%2=FPcJ|ExNX_G-+%b%HzdrcreJ>9-kN)cN^5fO^ z!KNQJ-SBX^ain_}%TnUx=s0{3QViOlv1UG>q%${@dY`TlP_ot_)uHsZ{TRIb!CSHn;ajTXz5LI|a ziJ=NpW}i&jZnJ&#;KBT0W~NO_lSy+hn;)LsJi2}7?DNmxy7R*Ejhk=2_2wIIysl<>aaUPjrjx~)nU!M59oaoep~7ip?=UE{6J zhG7eqq)o|#NM*=cB;}-?3FbCwC$qEZbZXjYJ4HyN$=cL3jb~47`rzZA-Z;I1oe#b>8M7=gnrB`!#(CraBjxw$1AD zVsjZn%7~UET-Nn_v4?nfl`7WO=b< z!Z7&aaC&)u65d?gy*#~rW6*NzkVoHmH7+*y?>#s=J!u+!ZYpPAx~;FgxVpUX+@CzW zoEknQzd)^>Jls=bEh1+h`ck5xZ)tPKJ4^_=QXYcyXHEH&o5{99hO{Sa8YCc;G{Zi3H zxQd7*VLP>%PE2(+o1aXk^OWXjTBRA<)I>X*GXso^%gdbeWHPx{eV~5bz5B_;?B?ms z;pF7>`Ol9v>cHIheeSz%+ijNpdgVjT>%JTM(k+M57Z90~rp-AMOqPm!YHZuB=k0X6 z-K4g$l$4^=Lu;C*oz4%Brw0H40XWcgH!IO(Ng2}+$yrzwOaa2G69c3|o|T0Vs05HB zLZtplQdqHNELF=zNC;FzLS+JL9h4+y$n&Y)yz!6!=|6exwXcm1jPfkmi9j0grLVv9 z{y+Fv@BZHJHkbGOqkGef2XoMxrWr~VpkU5YDp5UCK*ENarjP30Boc)|WK!t0bP}cV0O*e0U^}FAD`P<*so&FT@OA7WjYQOfazxR9pY5ne> z{Za2zwdK)qIay#nmo^pCBF3Zw7BdzGy$ML8T6F^~CX~jsR@(|RjFO83L&-4=QJlko zG9brhJ2ZW_9df%|4G%85Rey+fk&^zMZ@u~ETkoi~9P@wf3oSB4bi~<1zWvYs#lH>y z+3){{c0DAP`PNg36eYP!abqY$Lq#YE5e+KDpph6N5|FHPi4v?bJs^@agQ%0vsvM-F zc$cYZDoF=LpV+ji93OoBH-6(gzxh3-?J!DJ)meVV7DY(NjoHBqNA2?Na_MpTN&4XZ zL}{A#AT?0Qi^J5;G$9%-f+4(XG&drtu_R`qf`RlTbRY5%9yV|SU0kkv5w&&-Yog#M zfBECpN^E*uylgru+Vf*SU+Ar~Tc<}S2x_I}5P|SIvTz6)%HunC?*I6`dzTN_UDs1| zI&Bv7lpD*<6i|k4wvCBt3J<^{hJpe?h&cn$OfQ1W&?aSPHjP#Ts%o|7UT?RBky0^Q z>9>}BF`Kp1lP|pf+Vh|P!VXe*JrRD*KN_=df9ste|Ht3?$@+nO?zZ2#eevL4yBXwk zI=yjx+-U2bind;wVen0#SKHiY$sGC(7zig4p)?7V@G^L$*<2@0n$PvHNptJcv=j5` ztTav6dtTkAM1SvLY(75Prq^Ej!f*e>-}WY9rvM_qlnsgq!C9MLI9dF^Hs9ZDmh1Mx zUE2<&ZRbrhO-)Q&E)G;v)tT%g20>{BNttY}5{-l)!vkXdFffq4DVX$b+w7AxWfIld zhabFu@7`9@gl5};dC(j4=JuhS9Ur`ScBip+bbWlR0Ea8WNuy1cZgzBx!{eXadvCK| z=E$A4v%{knGi-ILY*n!8+Hg&(#XLorM=4%h%?c3_R2jfbx+0~tcK4k|zWNOq5?PM~YO;jd;sc{%`DIJ7E*Ok(3xBX_DO&fPl zNryh)yL;kec7ORNW=nV?;X$c%K@tc9tg3Pg97Ko)y%<~Za97c!QaR~FELimt9U!4WKnf8e znQU0pM+}y!%+v&$M5np5IUg@(Z!8XPFrsGd*IcUL;OpOc_=kTyI{;VF!;6U5hSKg% zg#uv`sj2~j3cDxv1Tq9e-1fxM41udr;8pTTOzPpcs>tdVl|Bne(qwuhliAHLzA|4d zNUs^wHEsQ)Mf>s_!+Sqy%!)2VeH1uk)d`V`X$qDdA#z>gQdP@QswhC6d<3AXRe(lC zy;7X)Igdu{suYAlg<8~Ar~n&9S{yw8`s{ci)ny8QVMCNXWI{xak6sGD3HgMO5(p^{ zGqRLyMleC7C;$%+67JC|+Y}TR0!E{f5I89j0&$=&X&O-q2h##3P$Ee75doQsPE`S! zJ5nBI(tPpo@I_R?^_nr)o`*;vDt*A>t+)Mm4;x-gr(A7(fRYx<2&wu~1S+di{YF(s zuPg#5s|b7`kj6E;sC4&AQ2<$F)WZ^q@!=POMiD|`*3PV5oV@VToflq;u_eQw#XDN> z;pG?J`Qf{N+OwY@+?})&k6t866cLh2x*#aYgf2`{XhiAf|wTOxVH5NZ3!mRr48#xS(a^yoML?l(sO?zJ;zBE(Pr<~RTME3Y^2zU$t* z)73IZ?G}U8Bu*(17(*%b!7DWa3V2OpR0x#a{-vwARk;cADo3HI9zd#)npLc7{93zh zXYFkA>aV_8qlCZ-eb!|#&C=W7yZb-?>vZ{-5-uS@WtANmLEmG<71_5I5LYGxA`(H+ z>MBTm8Fxgi0S6FulVW^4DFY3N;>k#$hz`%acYbL`qKJu{rd95f7kFb zYM`X&Dp`({pw40vsN%+i0tT3gQCzN&4lAN1z{xGPz}(c$SkfBPT(``;ga^yfdyzG-L6(<5IjbUKZsk<3l0 z;!sjN6cJ6JMXFMLN!T=KL^5cC zAYVJ?27?fasVo3|vc`ce1@;~|k$@*n3C$r_^c_&ig9b(X*G%J#`tnv!su`3mKOCIT z!nrnnpqiF2O%)_E5d>5O6(u5e2?PZNO#~Dunkl0vVlX2#uw*9I(XoLEI*G5M3KOWJ zm>~%QlaPV{5dbO#gaKg>uxM@Qi{p>ZwH|Y?3@$%IS>`fg7O9B9rH=Svsf(5Il15H| z!j7G~Hi?-UfhsC{WCDO>*ik1E8YnmyKp-YjG+LUMu>)CynlT`D30GwT&jIrO+Qo|} zE}iZ2WB54NO8@+`2gN#-8!mAKRKO4Q7)x2KswwGG1gu^D#!NcspD2KWfLLei?$Y(x z{e38P%JHT5)E-5wQ15S`HWejG z@+#8qfdInTgs*``(7^ELNgJ_#{}fD>uY=LauW zO@V;vGw%85rI)9#znbsf&5=u^GN{xUDwL>KRQIk~mxJr{Ma@tOv6D2fjQU`ps=sFv>kP4yF0FjiN)Eq1pXXj^UcLLOLJfTm)>lSyu+}yl9Jp3pGK&dhp zB&s4CiJ*)EPa|s>N3GHbQVObfsaR#LtmLHb(c;``bYXX`l`a}qO)^x(&10IHo9Bn; zFGA4#QbH6WVrg z45-OF*g!<24?@I*3aDT%C;^L6Zxn!0jt`H2g*%V6*GH(92%tS!9KZhdhwuI%Ch%o( zs3Nu?XaIo{<64divjhzygs7mh$r1nn0Xq-M(WvOHJn_tPE60zGHtycNaeaTZvzV8s zE?nv#JGOH2)b7K3hdUb&?|x9W?a3!jo;ZDKxPD^1wRh{rwZr}0axp)B>B9Q?3!?S4 zS6{E@<#;joE-cz|>&8t1O)m56>)EN3U-~UJhCI-A0C0$wjH4Noyuy0TD48503K1uCBn!j8v_=U8 z(0A&0u$oW_gM)0@n#IC#$ov{}zO;mW1TX7iD&TrU2%b#IWM0l8Ml(}Kd)Ke0ci*T? z9Z<_zIhtPk{@+k9w}c1t{n}8N?!NoxXk+{66K7JJ9^QLDwvC3cvvFs#w{vX$NLj_n zcn=gk;e$ILY~Q}etTCw(5aHoudie6IM2HzOwgrVI$)c%~X!ym<8g@)7K7P?78K%~} z0h?mEp{TV;7Qv9PyaVI+_me6%l(Z03ZS}pst$c6hdc|z4p+*U&3R|y~+kFiM#F}*8 z7zHJnPqXWPbLb3P@{B$)I>mz>JlIY~$zdigN_0L`W1pQkgUkTQ%zq9iMX$H&m?Sx- zC?agp(#9ffGdo05aE)w@C;yjYHIu+Op*L7S{R+f)qV-iOrxh|7dbRsL{=Y_SFmhTe zl7pU@lDrP`x?;na1DFyLDBB#3$Y)><(NufL8Bssaj=|4?h?db}LUegSS&uwWMQu|{ z5>W!w`e66|_x^5SNgyII0^WY*We9Jnqv?Fsw5`j+cz@$3-}|qpFP-ywZ~MWW>EVP! zz9?t^^jCj%V*R*!7#|+CP0AdN$K#*={XYcHF}0*Ds4nr%8}G3RLvY?{ogfi6swHYec4(%^pc)A> zLr1U=sRiO(~MMOmi+VP2zNi&7aK>%Cv;UqEHav@5;@RQs>dtnlK z(KQm$BiAT^=G4RyN+6X6gcOtw1s0Q8rL6*@D5wGY!_nT}{)Pc?$b}h26Tl*t^LtYS zq>v$5+r?S1Rq05RXketE2tx-VrU$D&HKYs7ZAag6gd3XtVKIsT=ysNRCr!*`MziZjAAN^YLUz#210bG z0tzaKK4R%mgkr=6O2sxKHKL>@V1yI^N6sREHzcN%x{@F(Dv}k3fIx&|3Di@pwhaPUZdJyTUpdiRaSeuJJWKe zKGYVGs4S~RZ9BI=C=aKTd0CnCu3kJm+`aeiJF^%UMA7Ha8z6rOm;bq4iYxl5=o=6K zB`_C#dw(>%a7yByjK@&PWPbup!+B^^Bn{C7B#T(Y1Oe+f+by>qm@g1WNG%JgWF%c| z?qH*qSYwQ_Uqd3V^_{!b_I@=DWn?qgyRs&CZ_VD`E=y=rN~#6~*&yVDU%E~I;Vvr- zfHE~SgCxy(@zab}Js+)fcTqoV>$+|41D+GXH zv!h5GMc4n6xKTYD5n|M?U& zQ&?TaEcd>s@4ZihfFR>{ugPT8E~eS3^>Q+W*u=VNtGRNm&W}e2i^(MPR-9$SBge*z zc{v?T4)^PFkqribSPWJwwb6JqoleGw`~BOi*-m$mfofG zeUB|c4e6gTec#I)&dnV;M~*OaE@Z_s$BzFhbNJX`_tDi8kKTH{e*d~eX?JJUTQ?`~ zT^CJ@?QNLVD;Lg<9&X-#`6bZ0p3F{Oe&*h)J1 z+_|xR=hk#F6S1@B&aR(3P2hKL-+OrPgK9pTm5WQyUOjU1#MXm5H{N`!Y@52Oik0F1 z#>4&1jl`7lUVh@_`g6}c_2QS=`=9@o4FG}N_|?B_cHWmnAehAJy+wW4$fVu>=Lga_ zUGQReXYkY@UmKM7CJ%nH3&7P*JbIQ_udL+fhKtSV-rI}O7GkT4eCDcKJ*S>!>&D{X zy=X4XH>W4Ato5E8sKCZ6)B3<^0%#JigxN0cypL$Y4vBzsmp}d03%~Ju#J}8(^uwuo z)694FUIRD)h)5!7UN-MYn#>nJ5#0hy8n?6TGV-~UHnsf+vmMfsaAf`kg^Q{q!q-_| z187)x1TQLH1sagNj_L0aX9y1v=1j*>HZ1-H;|>#`UNiZTlOHhbc@_o&?>uGXP98t? zTUoyP$rrl;RC~MgS6_;wsYEMp+?%}lPCY%8I+YvSYnRR`*u9rtDh~hv0X^EVatW?{ zo2GGXu(mopH@Wv;w}JfX1uE}W!!KT1c|KGR_Eb?+qmiK}_OLwq`=uX4M6aMmwJITE z#!t+f2WZd>m$ULhO1FB0-;YuOWWe7f@>>6A@1kY@YsBM8MDRNp-sJX=lWtM?GP(az zkaNt;{dN=n6IMTL!|7iCe-fLrQIY?CdQ(t)Q#jpMLm5{s-N#Bp{oe(hikh9O&XU;Qw_*iu9 zqg%!^WPNopE*8w(X&H@3S5_C}#dLc^J+D9Ybe-B$UwH1p+t*(D-e2gfy!70!tQ|j7 zMY;TqUn>{owV(WG(NvdS{L0BI&z7^<6VJSu$iMpiA57=t<4;{V`qag_(4}vF>){)3 zJ$UIyYPx#msg$7_j&9zHll^F^5uBSXh*MS|l091QeO!rvK10k1HG!B=BWf|4i?n_W z{VD`EIMq+X6Qk>!@?h4kW>0)^s4<=Sm0mRW&YvD0{B!I2PhI@&A#ol0;q0&HH-9|8 z{&&rIyI(wWYW=cnT0QY)fB!As{-@n?zsXJ=!GRHB)9U!{K{Fl2R+DlPO6sGTxD4{} zxe46f6#xcGDK$x}q!ZMzL^o5Y85CAEzHjM)w^rcEh$|7ECA{qAuPMEWGBE`e)yxEyZ4TsdE&+I{!Xi~cJkc$D_?x$M?b#v-t}Vr=rh0e?FHb`tItg* zlXw39dyB2DwX+u!aB=eZ;e*X`cdwSzid6=4;F<&E`6qAWPn7grU^g&Cvm}~SD4v?m%I{-0)C&-CfuLZc(NOy?0otu%X z5l1eZ_u-2~Tc$5F9e}*%XqCg)+xEKCpA`TA0X{$6_48;tE3HX8DK#=y5U^G>sgZMS z5^`ur7&7PDiU^cQjM&Ju)~Fy3otl6e60t=DB%svw@`w?W7=T$|5=p?AQ~|IB6Z{v> z2^D}Cmj-x(gvu?@+VFS#`Bk-cUjMX;|KP32!nfFe$z-JI6_D2$4WR^o74aJ=4cbkN zA223lGUMETv&~O}Eb8WGK5ZyM<3m6HcZ2@d8>$zxAI`=<1k~e4{^z22(Q&cA|0j#; zPYC*mn6o-GS`zI#-O@*+4+H3=0xtJQfAv?TY5nQ5Ti^dHaQWqL|Bf74+j;Hv?YG}x za823ft1E+}Yvr`u+ui^Igp?Xn)ldvIHd@9IIDreMtyQbTp@E;wMp@=_uo_^Hudbdt zQ_Uvj{wAR3jL&@St6Z#3-hHb++;G4MF4A&;iD(K-=+YAIi7HF2mJk|>4WB)+@})~n ztfoJBFupZ1^}Q4E=nJQ`!MiVS)w>X&Sb!Qe>*uq~>HcODD-Mp5X^PBuQ;OPTL- zPqPR{Ne1h*`UQ$jnp{__y(0Bb(y8BEH|yK<@j)Rooe!~MVe%XoNj>Wg1K|H2o_josTn`iEGJv_&;pf8q&M z+rEFVN{NuDZlkri@1f(gs9Z(}9zok!_wu4&6tih zdg|yiSL+9x2iM>920)F} zPsg;y^aQv+FkEQ!I`y6;|G%JVYkhFvM)-3lKW(Ju@b4S{RZ{O=@a|Wd=KnxB%)-|= zd=25CZ!frFt!=Jl*~LI%vH0<7@81u5>)P}g*%$+(dt@wImI*)p`{6xjsA^dB%jryF z)4Oyf8ys1G`bzKo+3la*eDW*5p2~9n-M5Zhyma|n-yUZDg{50>y!zhD{{)tL`H^S7 z@%6Pc=b(uXZeG9p_Ui&|BL2$Pzj^lZB~}0M&aK-oy&|a`o;-8mJKv$K7aVW=^e5Xl zZaneK<+7?*Pn_#N{q*#u%|&V%AVO+`0XVX8P=9uH^w!O=c4Xxn zCua{v;L}t8!*kUn)~S5{KU{g^kMES*buo~uzt`)Z?pxt6%%(T~OFDRH0DAnYyY#I- zdVnmS-l(p9zb*g(0Y9wQVr-MnQ;Gndn`spz_;C|Keei9gOQjfEY?L&RCG8%qM~x2= zHSIX)OZKe7GN5f8(~V3Gk||Rs$3)dG*z<3D2$jtMlu`nvV|jKK2~9m?ndAT0u zgjw!p<}$VgA#~Jhc2Q~536lttGP5l00#3yU2n-Zk@0@{C@T5Ui6&Vf45IaeUGGmX> zcd~=efL0kG5<6h-4YFsSQy21D+OnMP?XC=pW;%m> zBs%W+6b{G~ggYM^eiRrtGXR0k%7LJ$2tvzJFYC{1Hva`7j6s_$VyDayZJIX?12D2W zj}8Hl86ZP&3b}BO=yP{Tb)kwG0_kCdx4=ArW)=V>IZk9rG?@ZWQe|>rj24nLhCti^ zK#DDyCq$zL&@(ZkNBmS;yO{wA0RnpOWwH4I?cZw&%@^hi5W(Q`GiS1VIN9C`D?>x) z`u%pXNU1>%_2$FL?HjqXWCq-MNkz?oyOT5n0YwK2OUq2RR5VacT@bU=NvVRGLu7fR zqW@$|NX-C}Q9|&F=n~ED>>~+hd7F}-HlC_b!30WGxxjR;eS*y&!uD0jh-wAKzifnH4w7*)X>ChCl1kO07S6VQ$Y z&4i4iLQ4vPB~_20Xvs)FWG&@zX}ihxQ6iiUtm$#tb@q-2SbV}{m4Xw^uUhbjN2C(xkt zV7F=-wK5BN_6$3U?QMd62WAivG-*OyfFOI&1PF5kr;1=9Lss;Wi70_(pottam>8?6 z5u12q1P7QPfR6@dDJ#C@!il!Isp$crNA^TS2p?zWeDYraR#gk3xN>H(yE^~?0YEAy z3IXDHeDKdd12q$M29ZIqb><>i02MT^ng|4tkv@4s_~Ap?0nR?mq>6NyakB`5WKIo$ z*vv4J1tc;PHWXmOgjx{^7@3O%jY4ki$WbzgMr10A*2IaUoGdvA0x1vywg{v~MvTCw zsk`S$***ek6CNWD3w7;vo=_*Q6>yprlz91&HHf6f#Gn6g{AkYORt0A+mY) zrYxY)8Df{yh~)vMfD$>fBm}uM1ZPFi%wS-r6LRjbK*QH5Ft?u!Uja>43mJWctBI>Aa~rUy1TgG zXPmYm7@>LaOpS^uI?{+tWUQosc{Bh^3W8`ULfOm-sHvs~R=xd7?(*s8`(WT87!e>k zwbhNAN*4X_e;1u~g4Kte=D zA_GO%AdkS@o%0wzZTn(IMBYJ2t}$nXUPx+bsZ9yZ#1t4hDj}Pt1iB=ds6-}2?eHi> zW+nzk#E4yNzhehk>?rvv-8;Y}0kWxeOd3L40>2+|3qEaWq*0P8paFt2jcSO*B1sb( znPPXb*6D8*m?)uIA|mdDxDGrdi{xGE0ClzmZ!>i;6zdR3ip-C$gUk#;4OtmjHQJ-x zU&oUBx3nk#BZ!%g3C#1lfHSBFm>?klVlqKTYLv&e_KXBVm;e~Tfznb7iinttHe`K) zWY7ZuqF|5+QP2?~XhJkZ25k_K9D#TMGb1Boa`;hb?J)skBFq?#zyl+qMQ70jVzidb zX-b`r##+~+bmEI>Mg%A(#1Ms1n9)d3mBA%41QifOKqgpXPV~__h)h*F8OPH7Ax3Cy z)_L9SF;(8j#n!+?jUcI+N}s|x$3rrQ0Em->b2Kt55hLhf-W8^JW=3RKTkWhOoDhjB zvI7 zT>cDMhg<|wGX&rHCm(zE)`@%w0FaG zdr?XQ9N>8Yj_F|F&S{InsM@UbzCN1&V7342b(%3iD`SZR?+2`sENYq?){waK(;+Yz zN(TV!2!;4bf6y|+6f7hpq=2D~n;%SOhr%9Lj#5@+gEgreL(4B-ZSFr@yL=@c&UqM8 z(~>G%l3A7Jv;4$qj0r(8&tp|iuHQcWmFF#{=s3nI&ZfPSC!lQsiF*0y?HjTmJ29CO zcrZnLbUQDlQ6C$|{M=KCA_n5oDTzTG-FOec(rgYHpv(Q*(30irtCaOxwPU9*5P|ue zsuUp-CS_XO+FX6{3p!dvl;HBFnJzYWPkiC>Vl*4{{A_oW*!K!bnnHqn&^x%b*(|kP z-Pt^Mty2b4?T}W#M2n)c6Fx%cvtee40^|`>yeqN+%1--$9t{9opdR9xDEA#7AGlM5 zK0+g4=*|}Tk#YHUKYJ3aNSf3DC{1QBuk>CJMbV0Y<8$8eDD71GtbWM-5*}Q0!Su++9orf z07)0`yf=8}suw^N^8t_!-o3GYXbCnrYG)(=}9S)0+l{kwB6{l#~RHXq;E^9f>A@ zUFAE)2b1|uf)bJ`qEo9i5r~LHjbKc~stQE3gl7YF^vsWtAs^Y0KD@()qM~}lNSUQp zrhB5)?(ZgP7mX%}>Uz`LH_dc*^9^%>Tmhy=m8lUL zfhqv9Cr3m`Aez(#Gb8DYbOiW_kNQi*xIYS`bV^Z7#GR)`=(Zl7T^=3ry#1T>WiE*SM46==Z}I|(dio)i}jWE z!FIE|i^v9sMD#eJy8DGb3j!dq^F72IFe7rrsgXM%k#JJUh5=VL21GQLG-Dex6$%NE zK}kV~vZ#`Ub1_vd3_>`OQXS|hfz@fxOGvWK)UZv;>Ia%8O*>~Q!HT)eO~{}io;%J! zJD8!V}M?-y#G)Z)0NX_5*ivi2U6BW zZ#AZJ<>*6&!89gNR`z*pO6<9IdrnLW$R9z5|LS`0|PQ5ub7vr7Wttb$JQ*9%tP;QnZBf(15 z-sy#70t7P1T(506G?j)G#RZe4=DvY%<=$j*4^=8_Ou@_>wvIAIepK(XPd%*fO6bJQ z2#oc{J$ZQFRBLi>zJmaD001BWNklz_Uiqq2pB5*rgjl6jq9IH9jx@2#y`8?9QX$97Rp9?W@K zqO+y2ga{w^GyRwVH&GvOphyZN8Umbm&eR2hm~;k`z|J-BGlV|7B(NfB!#Jq)5ofV| z81*i}u(aANs)aUg*X>QP3Tai$iM0hi5v2<5im|w`7V_iO>_-B7Xn`DwE)W9P(!#8t zVHyB5m4M1-Xv$AqTzmTY#lgNyP|rtkRvSV!-CxW{9*JrlZ#^Jn^cjQWrUoG2%WEJJ z)6^awjHGQe&nNHPB2mx|aTXP^e7H?&l=*Tq#-?#-5ycxJ0kcBzOSmU~)=b|}nW;+V z5Y_PL^Us#!*RlL3Y0$AIbrt^i6}={GfZNn z#yOpIysi=<>uH)1j6pMsw~$-59prPBYy!*xdjKxUVb#vnDy9>y9HO{JcU7A<-gg{5q z-X%R_ej+-<`Ved^F4ML_Xw_WX-Y{qYT8-G+6r_lLf#MZv0538Rj@lF*WI&lg6sw6( z8BWoZwNNIt=y=W1I@nz81H@IrU`xd~KjzLRN5qIBxVV^4(y5c{&wORRzuD|;NXA@A zT1>Uo1Q-tXfiqA_HgXTafk(n>dlO8ZS#6%s0i@alCG(yWF-d1(U1AxRqEvN)5tLO; zxXYe`^W4F66uJr6V|eVUOdyDnAQMt0%Ab0UFr~wTG@e6tBnVX1%vwnXIx_}tqcXWg zwYzwDfMkBwHacU+6$qGfU`>o|3cibEGEHz3XC1K;S&NL9iHE89+=k zfX^Z7U21<(L6wmpiU!v(UI=&8GDJ|#Z(|<^65nzL_(L7Vek&Q z7NC_Ee@*Ht?QAu%Wf4gwPTFn;-s~MP`7|E`K=t6R2Qs3l(V`CB763iQOW<7a zU#in)VZMg<3>4|~0zA-Pt_FieBe=m02Mv=j}E8TKLBX~L6O*bBL0-bGZC*McqAf4NGUBAe*H-Qf|R{% zaQ4g1VlQJ?ZSBi+Qk=gqdjEc2coRW0(yr&KBUY$a0zsIOt`hUGdLU4*;E@5+ z-1}7(trmBW^uOB5)VmC|im?Q1%4+CXmgX0F{9!!;uyX(a0YtFGu0bI~b{IjKy2(Iy zw%mC!KgTKkqt9cgP*ovq_`v`N#xY6vO~rk1&9Rz@WQau^KEEGZ^J0?U`ca%3}QFd#!BX8*CB_%Ck7 z5uwP6g@ZO$m3y|1d@H+0#)# zV+1i^q|DSs{ebKkf+Jo-91g+-Np(o1wh$ba&8F(O2xo<&Nod17xTDF+C}{vJT7hwj zbFtmg^gn}ymI#%JTSP+>MNkzmRzQSgU90Nx7wR7 zVuaZthfFk*0U0Zpq?E`QPze--9IHqt$3rqjGjbnpUw>gzhe!mKV~w0xNW_}afrXxt z3&F$DQ{l|1c6T(qbS}lRSXrwMs@eAT@Zt$>gqToD@eGl{Q<8>Ki#Ujm;>JO_v4so> zO5hqZr$l7Q3?nEqpjk9<4n$f~uON!R9lr7NPh}9v025Y3o&iA*%{)p5WXMNDcF`14 ztiUAmK)5og-s^1!{cx>0Jfx-aFnB-vV@bD50C_jWzl;^7v16Qz#bfq>B>2nd2O zff_iBs-BrGb?qZ$ZyNvQ>8Jt-T8rw85se8g?g;E6#H4~2rCKORv|Q6d)g_1`$>de< zFCkD}-;Pv(TGUA7>o_$LqKKG0x=v+-STkh=3|Kqlgi%3Emk0+#=!liel%1h;g{F@s zJi7avn2Za*Y;`j(#-rDNibTLc$rkX2sdFwXTcM(djiJW*9Slc?ZdkN?oB8@$+thU% z!)l-AO=?pD#r^=crtAqQ2qrKFfN09g`kCqygTbPau#0zg4vb|R>ak!r13^Qj4hxH5 zRz0|{0EmvzC4HdpWhi9cgIJkytfGjGNBjNtwS0YLe)l2u979jFW$#j5S2kuOElV;7 zqQ)*6vURXX5tZ16Z2LeQuak4Qf8%#|>+bD4k z=A%gzH9||VEMG-DnujOa<{kh50Y$5;E#3F|)wZdCTE-P(OmQsOrZ_vC|LxJ@JB?Hh zhf&8(vkBw~he$rf8DN%iF`d6!%iZn^B(O&*1V&)%=mw|&4H+T2N4@qBZxsCS+Yior z7b=k)fGC5NW5aL!nwu>El=9U$8|CWT!~OPfHUMl!v&HN09Q%XcEgx=c&!wB25@YT& zJ=W`=Ju&^!TltXz82HTPp@{Q&y}3jEpsRiME<15#{PqVl$cHNfLNY|3xr2AF>vSdn zNi^&9>dUo~K8iFw?oCJlXin6*%qtl~Q8hm#xx+XV*-LRZs);;6xg4n9)VGjQ!dSOA zG8zI7$XXUi>490@#C-y0znXDxclJ&{U-uNM_I;C4h8DRtbpUF>2rW_z#=2A;1Oqi| z9ed9?F27IxQ0V<=4*=|_Utp>XLSF4`$Y1_HRp{lI{i*>#f@U<~)n5OFt9ow>Jj>QWc{p47kH0nk-~Q9!>RG5&^RPG= z51%|o28->zm9^DsJdKknQb(c#?P?9cpSCA7QBm=3QR9k>4y2m>qK+}KaTIlrsD&cYKtA_cw9Bs}I!6(8*v9t-N`RxtRjRkz z)QTm8frl5X^jdIh0EcCLzZcG1nzBX~RNG5wnvi3htrSniI4#?UgjsMQ%Hg6sL^yON z2CX7l$`#tqU#u1h99R%AhY_&nI7hFU#?Z8stei4&EUZlfGVm|TT{bm^>meut3M(^mVJG~m` zlcMMIwN`TgzHE9X@-O%~{t)TVp8ZPR$?sB2+ScP{W47nXZm1zc&Ft}Cvt^2d&115pjy78T}@4wG0TJEoC{$Ep@*^Tx3=NhqKM zfhj3=EiJDI48>Ag+?7ZyArg@zbiZ&!flKcJN=n{^Q1n9C#FWDE<7>}<9b#1-JSY#R zkU(U!8ZESGO&lFNwYYsNv}yc*|G6YHByt(3Lgr)B_~5N=T8G#Qx-8F%!$1CO(lmMP zy-2`nWH6?#K`eXn00^Qq7)Vu|Vw2t+<}N|Hrn>Ycu%S)MCSH}1LF zLQ@TJG>vc14?jrrRNw4jQ;Lw2Ix;&(ONl7go|oA|(9QN9n1LosK^=s}t-ER(4TYfH z+U@`V0Y*lVnqxLL-^VUo0jqPT)1ll^KRY|#3&7j@Y+T)WU~;6#8cPL^{oRu{r)z{rKIktv-KY3%=-=f9XC!+eqGe zxKAsNlV7m6kASn@~EgByHwe~)1?KS6^|NrkdaIP{_H38~f{xV2}`AAaT z)=lw+FU+pJs(|8Hk^&&8M-U+jd5Gm46_o^>S1MB7AYf9TWdw+(4LXuGS_sY$+VPA$ zxT0sOt*8qwRTTmf5n7iW!7f<;`G|-1D7X!pM4Y3@e4)tBrC251bAG7xVZ?VKl2H(u zASAT`3Pzj($PgM( zU>tOyS<&{>f(I&!fNTgFg^K*SFH3~Dn4}c*qsMW7+#XI7C^cMD)5MI;GsbP!;Zi*nX7V!d=}S|5?(5e)vkO^T5Zd z=AooRN2|upB&k-+D`sgl|3^)8LhagE-TS)YyNBWaL{iE!~7kV5t%QOn^kFwPQ6u6(8 z60$Ddx>mn?VF5G)G2ko%obFO=00BqZg2t6E z*0wdBo%-(8e*g8xVOreo?CY~*NDf9uR7XzPdt@-W#U!LDtN`s9hzO;ag-SY~ zzJ4AC_r@V9w_VX!d3P9gCp`d+F!~yO@6yh%t=F-&xa!Tsur>^KS=zq5`;F6+SC-44 zT|fM0Q|s$DOs9=wqc+jo8IBfg&t)m<>)wizfoWA|e)h}J&-WjyB*n9el z&^6nG=i%h6d(RA3R+v(=r?M95gz8pPcb3mEtOqED&@-Di6DGy+!;`;F^&a=v)9KFQ zT1Pjw-rsUR9LI;vlzNzo+t>c^Wc{Xu^>p_Dr){yfjGvKfr%RnoOQ$$BC@QJmK{!(0 z6>uBKl$MSKD_xxZ+!=Tg!c3SVtd1J!rqfs7q;acd91E$ zCAv&bS~{~u8Jpdwb0A0-#7&zrcQkrNrW-Vv!CoPo<3f^xV^Z1a`x(!#{-#2T4Y8;qmKzQ znM~y=N|Ulv%}mNE(VQ*S8IFx&cOj2Yl4xUSYiN_%`p$cAua_;c(%r6U_v*g;ptYt& z_n~2(iyD?4wrgLxb?+x{7%7alIxc#(F;uft$vNc!(QJC0RoJS7 zPh2z?Y8UDLh;%5C3**j&E`5M(6W;E@hi9)wf7tuj^C7fYEqf-9PhQT<)8+9vLD*sr zZ@>4yBy6057=TEw4TIREY%zcaA~+^YJ`Q3sk%5HSP@uk9>Oje97avE{m_#6_%*^rh z`2N=RHs4rJ9Hy6Fv23Fp%W>6R-PS3Q!*JrX`|o_P#bJ4N_V#yPUhM5Ap$M^be9or$ zqM?z+k}faKr1bJ^)PR;%fEbo@x95eQvZTNy>r#_i>wR3qJEA34H09|Bpmx_?=xx=p zb+%pBZK;7;zPC3qTk_72b~L~=s?Sh~Fv+Owi53twnn?3xpP`JZA`z54w=nl+kUusE z`x(unnE~?>l(oI??*c>i*COKX$zLjZ$Ag^4DW_(`gVh;bZ{7Xz*vGft|GUgBu#FGi zO`NH(7>Be_fxbKuG%O0&6{-r*^tsDJQko3_00Br?wCzJL-^Rq*b69PkC_J5Iz(VMn zYGhhd-jFhKin+LWQiPOq-9=TDCi#ZnTRxmFhVj9}=x5CNSaQtNQddxD8NCEtoConhf1+ZOF!K z_%L3}&drzg5*pJ~?$$2l?#(O71<=p#K0J8x#$tcZQZ_I`a1K|t2lIo=TV?+XOhs@X zbBgHZ))|FbOrlp-8tg=5*6bl7GZa)%9T}pkp|4{7S!v}*`po0t#TPT~rIv@=Up(CV$~*V|(e-o`&tBH!{N1YeZuv$y?6C=|5m*F;@+hj$7g5zhgYY&uZ%YBp$(mBW+DP@t}BD; z4U4eZeV*m+XkFbsqv*L8otZx)=m|8^=}_iCQsd#y*H6!0-CA5)$FcD;dE&Nn|0I0lJG&rC> zdxzBklN0FT)CgyIiq>TvA9b#gkFL9Q;z%lGo-sw=Iyy8T2Y2^THiZ3+_`?ZI$ch8kGFTXwzhov;AA|OtZ%;ODrJ$y3>eGIbM#3$JyMu) zO<9+Xm@)XDVn^BpA-5p|2?yKWs=ql53uw%~FtZ-(OWVJ`@TXVfa?y_5Jz^Z%uGwMc z;^xt>-@X4g`-^KkTh}~n8eeyfjq9d9SYMb1!ZTdiR83E7C!Ap%8>fM>fCi`$&TI~5 zTtL4E0QBgy`vEke_dbp5=52+k88vno4sT!8dbM@1NF)-z-~8xk`TqUIwZ#IRgASg# z+^D@PR~9>al~S*WDmP9XozqHYfNpO5Ynh1IHZ}jTqU-VEk+IGGfT@l;IbaZ0L`1|m z9WUCI_0G{r@2$B200BveQKKuX+5OyLM{=M|oXixN4o!qvGc&*`gI0q((mJhyFcGU1 zq=B2{b0?A_TOC=-BcTXm*38N%XPU_@$xg+_rF8Bo{K!2Z0IO&aM5YjwtM*aNtT?81 zMF73n5*g-Y2F`O&QL*f>Da5lmjMrORU?V$X?#7u*GYWq`!^uPFz4C-VH$_oChc=^n zL|mf>C1c zeFOE-ER59zh_$CCEh7rgl(Vn&qc5RdbkZ1%&A4SYcx!|yCvOLr_rI1gU+5y&&H&=+ zOaI;O_N}A+XAgG1l)0AHnJejpSb`n1rD`&)jp3Gq{zYhME&bPLukWeahUwb;Gu|rrvu@mP*$Y zhsw*FvxHNJRs`9>D3!G=Y>7-oD2fg@qkE)?R3NK*K%eI4-&FC`7a0+KHCS73U2p0l z8ap$rr?1y>`DyK6UtYeg?W?PpisQ^4i;zPtCsR1OTMn2QQ`Mp-x?>s?+cCCjv_5S` zEMgk6Z>hVcP|Uq^kxYJW>?q8d+qQArF$^3`ZVajI?>uKbgiOlRBzEU=dwA~VrQhA# zy7I)8Kg^W06wV@-!ZEo*x)jtzq!C68q@fQO7g9qsOvogib}tyaRR}H~8K3A4IY0~2 zGo2c|JHjwE7Qo`-^@3*1$%?1jyEW`wyV9CJyz@Zo>EM~0Tee7t3ySok!S`$c00BxO zxV6nMwMndtM01}KR-`H^P^0?<(`Z8E#(FgxM#GlOGb6bcTmrB~`dlAY2Mq|SpD!~e z&e9hUHnSBCnaRTEq?y&T@o1TTl>M$vqYg=Ma7LjflIlgr*<4ywVf9H}<&Y}WAhPFd zYnl}RgOt4t8=#QM>`bGBb^6FUN6kk58X_?1wfQ81j~t*MQajp3F+B^Vt4?QP@g?ih zwP~3oq3i|=Z8PCRBf0KCI$%Q29Hj<$Vye_KXF8~i+L&uYFwp0ltj$YlnZ;)qKN62x zC_erkW^{o-2BymFNFoPIbXl@%Zbh-0*(NgTwaz4Hh5V_bfUC&yRTjpwW2sslwFenxV z24pj>8`(p$l0(U8Ovw5?_jYiCd~+0~n1mS!MRRwkQDis8V~?Ym0TUGJQe;jUP7H=f zn2Po-gD{ufD&?@jV3uC4s*ms3{4j%Cg%?FVArrin8jzXa zar03^LTje3oL}h$syzt%kb$R$p}A6xGN;KR6)6PDq-n#GJfQk(DeGE1k- zWd@?_)5-~7hKi0gP#ICv6Xzl@v3Q0533);Q00B$!la!Dg^6XScCS(3>6j7XM zE4UQpG}tJ))QE&Rtj$$*GPX^VC{& zz|%sCwGWF=I_%m7@)yy_gw8EKRf{kaJgc3$q9o`*j||$51f#hP1bR;OJ4OUS(@qIO`M=Vs3kYA%VddU|DZJ{c%w$HbM0&CQueh4zRw2_ zI5Or?5&saO;)H1tEetlgu5{!DH?{stVdiX~dxVW*7~O1c`>aQ$ zTVYI-mE}wY!swe!yu<_*K_onST;%d^7kHD@0B>fY*I5#cTg4)nK5HE>yO#YGyzmzt%RXEu?c0;5UF7f5A$LV z@$7SR$fF~jNYCEF5^OAGPn3+X5TX-q85vW(Hy)MO%K=8R!l}j-jW97iEChqe+EmA3 zBjiFdlZZmKK$>V$)#v>H00B%s5ll5uDLB}eE>t|nRGhBb9GE~NqS#4^B-Q4pq}!tj z<}dITs`&pz&BN;dRbSbRoHu1CVZlriZZ=L8$4!%)($UCPxYj_X)l9ZipwXs4u^`9PDKr5J;thrfdy}=wqRMr1)^}YWrkH1!e)DwpbsBP5vJc^6 zc+aUyl?3HPD!RT~wQ?wZZDRVP`G&5O(G7gD~R%TUHbxUu`-docYrDOQEwXVpre6&azrZiUo=pneV zI~P^70}#y=#l)=fH{m9kyftT9T2->qAE)O=bkJa9Vh4h>AatK-QM9yRbCqu?eB?|-_Elo_;nFnEoo=DJ@nW%c1 z9%&`dF`Z^)D%9<~1=La*Yz7y4r?T3iE`AS_O41F?%5>AXkrV{6cS7?`H)b^lT%2G0Ea+8#2{tEzK@h>s1EAd7d3G6bWi|6;G-hkq$647r)f&#$Ba z4L$4mE@E0}B1v?g8{>Pb!qVzVx+xQm%no?Mr=+1;RD4bk`Uc|WrnDN$XECuX%rR8S z!>248W~m6(c`5|;oSemsri#8r8BACwDQc!N*XczJ$tNvgOwUj1{wXHHCFmSw#`(?6EVq)3n5M=1 z55DxX5BgvI;Qjso_b1EZYDC;#(r206_zdmVs&FMJABGe4@G{VdVpNFXzO|;y-1HJdQCm%(`nps0*PLE9WqrX27u5TssG2=2>#^ z#V~dH00e=lx-1s%k@Xnc;8Ioy4=9nm#|)BcEkK$j#O5+SuD7c=H&gVs!Ovu7j}8ik zMB1F(p-+LBR^i#WBR%udU3=+XyR>_A?@6)6TJEk<-IGjnB21PxWFXv!q@*qu-L=rD zgeztN5Fj6M=jmkT73K<4N4jq%p5yev_nZe$fYGlNu zb)yd)QUJ1R;eu6Ke>R^a%`zDj$%L#qo1sCLQoopYLJMi^eXCU^Qv#_hZ|BU@sk4AG z#xzW+>_K7&+ZtBO$q6u9jFS(h^wy-HpD&wP7;H1Eo4yzjVU`(2M@~S>nI%xhxu@Aa zIjvWbdTL@Q8cc|CgGhtYh&oC)O&LB!q{9L4=)rBbwE~U+00B;6cYg3^3$=r-^|m8> zx^t$d*({%lGCFcaTdUUs@5Tj0A|V$Vv19^q#OVBm^MrNC5IBn*; zQGQ3G$Q?~P#vD^sg4h6w{geC4^@)}c&qJI{alt9zGr z*6ZUp|NP%yT5Mh28a&lY=F7>=MaHVzVq4aPQ8HP;HiHm%&2XnmOR2KWjA`?!e`J|% z7v^s2n(ebCg*jKWW@dmeI57@}#m>&{YnP5sJCl~J4Z|C+{rJt-zI*9t`{44?S>78^ z&eh($IV+#eUe?(LiDp!oD7q=47*F!#0&;XyF!^}UlQQY^w!U%F%Q(|u>Kxd6#Ere3 zqk{+cMr9vNw61pe-v9llcJ}b<)3=Al>_AJH18Fj3Msx;2v5=KEMRzDWU}ojcL3BYX z>M&dpQYXEB7JlLY2ib-eGVhnE1e!3EBb6H1JGSHL#g+TV$8c=7JxqS`@a^U6|F{*4 zz5NwOfip?$;q%Hdrjg6?@snQT? zb{{zp1qg^13){YSb?@$7H_0_PaQg85AAbKYcXxLVFK=sTV>e|VP=k%Z44IIn66VDY zB#e3PjVcP539VzusHe(4GDH6G3YdK=HD(sJXL7NbWa4B(Ag6A7TmIzr#ank)(Lp$q z+l$x!{QuD#ukSql)TQm6Bp9jYmgQ%ObY`qg0X3w-B4Vmgu_^)%P=V~VkHNb(o+|!a z?x&DZX}asA-#Q%`Me+0OM#4_|%tjlcfO%SSs;?jCTto?0v62t=yGjgZDg3*x!B9RRm)?6HX|Ns0o|BI8o zC+^2DO?QUz^3naD{O#i8PTL)?ZLKwuR(ZgA`;ZZHGA!!UWk#ejR}~I6PP1z=EG?u{ zEc%=f`<&i2s}7jimxc;z6ronI2n92Zi*fqFwDt1NjjNVl89P?1!`EK<&guHC?H%8{ zveSuhk@8dmJq-a9B?DXi_$s#NCmf6dtZvqT90kGw zAq&KeeUc;(y>a#W2PgNR{mQcnoZWlp_y5KJaB{kQ`2BBly}W#QYu8$=Rxk&d)tN)( zNVA5vkkf`nGlA(=7jA;aq8M~}8UvY`7yO*_dVwaSF;R9b0SO~C=kH9JDT{GvI(vKT zm)m;r#8Xck-@l`AdE?33t1<3;=T8rI?dYhZn;2>|iYX(5XVe-zGws7VQqqp`K47dA zFGnduW=vrbdaSwUGpeJ+Y@kJ2S~rra4IM^081o5r>dU7cJGXCNpCXR$esJv@zY@Ot zY%?Tq8o|m;v}{DGGkXjn4U@R1w#dlacPMK(nT+ z)7jSb>zCIN&wllVFFyH{b9nd77f&AEdFJ`Wu$X%E<|YhNh6$|bMTO^Bz+S>ql1o!2 zsU*XiEm9s~5w<}VpX)J?RuDx*W}?M;7Cz8_z?Ky zBegr3MTr8FOhZzcrN$7hw5s5>T*ub4Kd~?DZsl?uZ$9_@rM__UKq{POX51WB>ItWU zLMt6z(cr7I+Xs6`W8{_FH=cXu_QB!d+i$=7vzNbhc(~Zv@7YNY^F>N)baz@33uUC{ z(V9FUN3SU=LtxT1fGyHGO&1PZN`b6FP@P83XPQ2{d1XB^6bYMf=f?F1yO)m^Tglxk zw{G0Nd41R$KKRyO@$Q2szi@My`da3mFagPlB)xfx7?RC3WezDqMl%xxl#michzX3E z);bps>{EvIs@&V)F3@XUv5|lUrl}L7a{`jnGfAH`?OD5d>-J)I-;qCg@h`fqkFFkd zn3f%db3j<>=aCJ90{EoCm4MafJ+93}Vv=3?`K; zA|3Xq0Cb~*`H(0xcbz@NkFCc^Q4Q&dOtFli6j5guq_j{VF*U`VYyaZmln3Y(_x87M zK79)S00B^0-Jf?S6wKtrXe2$2A=+%$18C(`68a>Jsa$M7{n8J4=e>8n{43w|He9}Z zW$WP5dvE@5_3*8|Bln}3&v9UH-UqFRsW)gr z4Jfn6g+50Kkt3KwN8N=b6U`djB_Y#NQUKf<@!E4w{>h6!c;d!WU;eeGy@|eXY-Mg31tLk!&Qn3%TXqaTp)M8bN`F4|LmO`&)k0Ui(dq6*t=wI zcYpk6JA32)o^lx+$ z-`d*N(UFfab)99dWHDjtT6N3Gb9Ag7Q_E<1W_@be2McF!xo+dwA_nVi4y>KKcKBiU zWgSE}G8$(&w5Ep5D?=WcH9J+FUA_7z@4h#l9{=X={>#1ngQJ@_pZ@Z%Oz%HjzWM64 zgWaocJm}C{rjgUAajo7JpXE-7 zS<`^rK)}loj$)4{jEW4SpiT>|pL^w%*M9khCtrH;2dDQR{Kjwn_6H9iy!G1OW%H}I zMD{VyJg2e3FA78J>Bh80Mnd89{88beNVtNIp}`SO@v+ZIW|r18N0~S;6h&zSSwCw= zD576I`ilq0`}8TsSAO{YOZz)pi`_Tg{?YXM>jzuI^)_Hy)5<#S73oNT>7O~?&#K2H{XBj{d?~} zeDdk11`hAO{w>~r^Xlz3FqEW8DeFwiI09#xE(EloH78PsL<6FdQI0h#v5{su>GODI z_@QV5Kw5p^sEqx_VqfVXgb=|n9lZ5AZa@9(`|rISF+FwrRsi?jdHLQ4uYCCnySW&b zQ!a7}3#9evrp#CfYAuk{1h3kR!~_%RWkFCgYo2awexbMS95Mq1n46X!H&OvIYx}Mm=Z0GLVhfhAC>rX!Y z_N%Ww_xv;7{OsY~_ul@VZ|mS_YaI^~X+&VEXntCxRk~8$vXKY?00B{5K6?M%d+)#g z4?BB)bfrysW@!`}B}Wd;6j1Um=u8aOy@LE&QFXe^r&N<5|EiC#j^$~ z(Q9HJaqd1$hP;o>s?heEaQNSFaxoi(D;f)^bZ}TzJ({ z$`TB?%|Qn{ce*Ef0wD#WBWxCOKN{)0Ak<4P3_C!%3@UF{@{DR%ExouQMiabE+U|Y% z)HBc6qV<#h#?M|^?Crhz%6I5zmoGn&93vuumJ0*S)ETfO#bGFcQQ2m{xH)J+O^D5% zu*yIIetc>yDVV|etPCY!R0_yoX3i#PAp}$JJsx&DI=Zs#$A9v_|1sKhb9;Mld;8ws zfA?T(xV%`zxS}l4%zXY9gILt!Kw6oGLn*+Bpu`9$5*-LPYwfW>>r5#vjL<^4q7q;R z1j?nDpBF=p1rl5L>Hd3LyO(d>yfsbzgSTFLc>3^{pL=q=_oHiHST9_?cfv3fX>kqK z?YZ8%Ae@}YVbji`)*~xgeq-4rWOW<~_x;#<#`V&`mQ4`d(nQN_verz3D{>84QX)08 zju227Vay9=p66T<0Wg%rYEWoCGj?U&+Q@{m?)ZENM(;OnUjNo#{keKvzxm9`>g@QX zpKeXlle-7#otd371KiLP38E!~ZYEE_+%gCOnLt`*YN8^utGBioKEtq{gwb7^$LJ)? zsLJfjmPWzcr;yoMcO4FY^pls4FCFflJc#SpuKng${$O?d;GI{$b+CJ|cPXblOA2ry zo4ga{6ym}&C$@B%M@$lXbn9S)SvHHtK#Bg3y4*f?m>%kps}BV()sPCtoaNI@ii#;F z^;@^@Uuw$-AM9`M-gxTj{{H2M%jKOnUSGfY?(@$+v(0AfDGXAosP5~|7SLd=L48Ii zlwAZumP8|E2a}kX{ZlL_sMieu*J74lQd_yY=9ES_GG%nP_ip@GFTZziw70l-|K9H2 z?$>|scXG7*Fa2Lwp4>bPgd;;P#;G&_yFh?+lx1|8G-8{GI>iX-5H)HFW=>jXRt*Jz z!NEkyq6VuLlbXxVTcV_lByEaRWynq4)_dE(@$QdeXR-6(zoBO&CK#pG8jdCSld(p00C0|(T}!xdVKG%uV3Ha+YMw-+ky_kk?9E+ zQV3`?vR($tNzueqY675GQi(PGfA)!^VY_vS0~L@_1JuK#n<-l+!>mJap!{X& ztcN7r!V?#%1|&t&9n7q3z&zI#VG=1Y!Zu3egk(16>B;k7e(~ht!}s1AE?<7(g=gPv z!w2{8-&(bP=kB$yKe-sATWV_|iaja82bx@-6{}-PtN|LbGt-zXa%1)^Z}UfmF1uiS zZ?Q>;Z_X_0%9w|YQc7K#Z0d{=SdwdgHI}P?^RNEP-}}9Pe&_wWZP>bc?fTm{#C{nUI5YJh@9smF!07*naR541J z%W?)rFhyAgauO%RWWF{F+~51HmtTD6*MIxB{@`E#>mG4(@7}dbmvi;g79U)`o@SOI z2SQ6|Lc$~i7~M57m(Yk@Lu=)jeWkuaU$LJu)|O!uKff@8GAwLXMHA!0O_G8_F`=i8 zBQR$A-dA6F?c`U#_T_)`Z~vS1x}U91u3x|T@ZF!qbbRC5ZrZYA8Mcfz=8)MGgY|}P zm>d%`n$*x;-PjGCfV0!0EMcFrecNp0eq=YT)2lY~x6I6p2#tM=(R+LKnP-0bz3=>I zfApV!?HgZz|NT2JeEn-*`0^J&`0fvO2fwzxXVb`OjB#aCVBKvB#F#N5I@J-~YKW!I zTst~6MNWzd)5uI-b_wT;^?SJ?V zLI(#2dx!gX-+JYPH~;a=&t36F?@8t)zy?J!2eWLEV~V69eN3fMNx93AG&4-jXqLps zMid{3jS2NUBP%ZgDV3dY)k#B2r3DgLjC}ot8?QZl@8+c=qmRqe?Zu((EbhPf13fss z@ywo06VbCdXg<_{jCgGRc+S`h$P7o;v(S)8Z88mp zbYYZMCi1f}o*u^n)F0D=}&Qh;C@$Z~`Nuux4+GYlzc z;GbJM`aT9(_EjZ0XjYgJP}#a6f`Al4A}9e#$%LW;V*`QaYA3A}c@|MT8jp!k%?|F| z*xkO~n5#o#J|c6dQD&ruK_joO04MAeSPa!rkQLd33l=FbdZfbiA@ef&fKxaC7>fuh zD3)^-Y$js4nJ?)tDJKNH`drkjs^EAySXk+1gC`$*^s}G){N&`+Xgn6M-M24|Hg_g# zjgaRS3iO_RK(7=66~VlR;2{*C0W6?+R8JCEg$2w4nvjPO3iyZ#fcqFB%Apb&h=`%Y zOAb{E<&=P-8i`=62C z0ZcPV*Qc)TcJe&^_IJL!y}P}EsO(UTgiJ&o0ker{ zc_FBoib;V`rg@9{@X+Yv2Ot{7l6C=r*yJ!41kFeR^st2^0QF$1jwk>qAR-KFzdaoL zMlF8v`!DS8?JlmYWMHuWGC{x9YN?GGnhG8@Q7+qdAu(c7PL?w#Q2T~UH z!e%ZeRRk_iO<9^LYN=#2RSNxNu?iGWr$qVNLC`G6sAY>YVgJA$PU^MWC!m4F_ zhXE^*F)5=m1xBSZ&=Nm7;Ejl-Ej1ica0Xxm41iEh97*XcqJ$(NSgdGpuRV9?*3}8i ztIg?09)IlWdza@H7j%24;&`@JmvKf+kYE5KA})_SAu6C(RG`BXUcPhk|C9D+Pqv-c zkzeLo-##^0-Fd(a5*#EpDQZ?r>X0q9haUW3JN)VhB|PYA>f+^Tc-{)Swczch6NlJe*o5s%3qZ&p4s zn=qEzZk5;Sk?fT(5)h&RF<{Yym!AFM{U?9)cYpT6bI)D9arHNT|My=200C6atV^D^ z=a>Cxth@c`nf3&+4~4n}2tWnVAprO?2-VQgA(|SLEw~7xfC{KkX)yi?r%;u}N@ypj zf*P`nPhTp{N`UW=au%Nl~08?ip|83z{mu=p(2`rl!ACP zF*albM&(!;O5wrBa9L&=0+ude?_)NACCq4Gs1`ugj1WrG9Wo&$0X@FDdGp?zTN@|W z&*SWLv(;`UwZTtbuGT7zN=3alQ+14GtRy%Ih9*d8KoB_)1qBpR4duOSDk$WRx|L6Q z2}@nrgI+=D@M?D@PE$&r4oO%BaL%hw9D)T6I5GX`dp9;Fr<(>d zM27?5f(B|PB8Frpq8SQ-N_y(#5B~bEnr7p?c<1%kmX949-o9EnILOn%%*-h*GBdJ* z30W9Wfr*F$fB+a2e1ymtl`E@dji;hP;S)b9pn(aQ0TPwSvzBJ5wrW_=WgiMUt(Ru%Rjfwl1LPSYtC+G{C=Z*Oh0^T`%m5WkjSQJFA|+I0eLt1y zeM2fZqL|BK6p;W-v>+v*n3SaK;7TwI5d;wd6oE||({J^y_ojrTyLA z*@daz?OThp^CV!9tHpqbpaKp^9kB%kX0<>Ouu&972Sj0gP)!#lS(md+n%=8!8ogWRJ-6GJg1D?v6QDsNLN^NSeJMZzSX9G76CX1T-Y za1#ToA({dZl?^SZ0h)m+f-?vu9GfPtD(Y{mQF1hf@`vKY8K#VdpQS!T!R^QUGC$t<0A| zG9Wkt5Rvq#j9>%;5I}*F$`Sdwz?g@5MFccZJfa8@jlk3d%m5v-8KE*D0U>$^iJ2); z5@S@079VR|dS{}0<^F5Cn+}gJtQ=ojyYtfbo1D+q>!M(QglsCN25hAwpyXbq3=Cy8 z1|tvzA__=BAHJSHFq&r?sD$}S6GWv4qd2ApCU9tLs}MyHazrl70L(YybfMk;@#c?y z`p(VU8`U_Po}HhWU%2_k8}&1fuvJ~+EtrBt6nRr*10^N|1QQR4W~wR($OcXnB|N;7 z|8}w-5APc!00)4EYGs*cYCuw!3j~Tngi1g}N*(~K$3NHU9DMp4|MJ`ycE|T`)xx-O z`q7&|{;R0ws1k`cbYu_&3q%3b68uCg3yNR>XbPyNq(F#fToJ-g0@Fn#6qzZCnn*B< zz{;JD1_o-N0!RoL%$uR9GZiFd)!}kmlj>Lh;P)SY_Y#dV7ggeO=XPIxZ8#j{Qbdq| z_k?WfQ3wGTof-=mF=)wmtC0dJASjB08QUkK90&-ehp{$>rU_d0&@x{b2!RcZR1pv~ z2pF0}Fa$M?X8UqBquQr`^IxCqyk(6ZHJ?9_B9H=lO=AS%jz%f=3h}1yBS*23IRv0|TVUoEgCdwVq2iO0_mLptgm zWW}gjsj``q5RlQA93X*nqGgC!KwwZMRZuG-090WsU-b7?jh{%?9~D$+N2P0-^K3u? zN^G>G=#(H3szV?eb9LTLo`3sCKiS#aKDKteH8~Nt)Yb5U;)&C6d9Bb zzYah!G$>Jt(o5L|a0HB{PF3;a!#7m}C^)9Wo2+csfzSxV3`|OMW;G%RLg<)8As_qM z`C@tXjUWD?npEZh00CCbCWs0IhVM5lM>os+F13gRP}bfIh6ZAX2SL>Y${(>BYG5-I z4-&Mn^Fa+n3*c^Xhx=`ViiF^Q|OF&YV0^XE=ZAWHqjZB9Ljh4NL?SRkSST z%Gy{}RfDOb8frih0I{DfB$T1lRbY7t_5JY>N5~{df*8;Vfl(sP)JbqC8j^+8{oO%A z8dZ}t3!UzMyIy^YawbuT70F>x0z?r&(;UHL$?<7Bwf;1e_rgB9WRB;8-+7XhL4BToQTkfR}Zj5h#?fz$dk@41i{c z0;Xmv0A>;(6yOW-g$9orFbGO+A%OQR%06hGR~yZt*o`ai)G9Rwe*3+5V!{OI$y4VO z1t^3BF*pz{_bCCGq6R2${!;To1}5bpGz2Nx!VhI)eOwj=AsCwRArxkMI8{q(Y63tA zYEZI?N;wd+W3iwS*4Li7_wq|OHurj?Ou)68la(ai9`x6e7=kj81~pP8BNAm$1q5Rz zQ2|f_LqkI#CU&44DI9hHA4L3*I9WqQf${+|VFeRZGh{ z3~TPjkKd|P?8>!wHn+Ab6P3wE<7~S!%#Sa=Af`$kt?vY;K@4fru?dZhT zPXF?yD^EW9m@fvF6bKAxWN1K!qLcs<7=xB-K{U(>93mN%-hcsF0r~I66CT;26C$vI z9sR3;|}R6sOhAW{yXh_Ndyut9zGiS66BFTefzK`K}7+!^-zPk;L2UT>pj z%8`_jf%=Ne5+`PLnJ3Xx=_wL<(>?_ZoT0Rzr;}8>4tfbC@ zN01LIW&w<;Y6{&@x_ZHm=;?{g3~%fAYo~@2)H?Uc2)4pa1E1 z{^fu2&)#_Bjjw+7`RPV;dS-5JZW%(5U}EZ+r3~hlfM`TiP8uINUK(KOd-;(a?LMjQ zH#>}!L{Ni5AqHe46;wb2hv-Ea4cOSnEZ$(X(!I+4Y z^TK0~PF{X}jx7&};6hYb4rsy5(1Mj?I%aC2>}LT9%58E4eSN|blY#*-5`h4SfCyrw z0)Q&0h7d$Cia-IGz=(>x06bfnd^gF~pMK_-Cua+hN))vk?)J@FY46}`&wi;v$zvBU zs8M+W0ST-eX$1fzB7I;eWQKrhW)eUnEn8E9j{tUt=aL*JR7@70scJg zBE$-^1EUfYB|tJY2uCmB&)XT=!)Y=IW-4HcWF|q8kx}W8mP1w~P%>qR+44whII6(T z%;|q*j=A1!Hk-F@$mc%y#d*}}#oElZH|9d_D(VXtq5{yMD7il|FhVd?wE!T*2#82X z^mhc;o1vK+f+Iu#Qx%bjoeC1FBAN(Lff$pA-~bWPg9luss3ZC3pa0yk3r{@v+-Ivv zb>sGvwYu{~`dh#D>y^kIUsAC9Njk`bn$&ZMryR*M>|85aY&P`ugY+tR`LQn)kGBHF{2au>$02nO+V>2>4 zr1g+gApjQt0Ix#;AUKrrN(q9PX*t2ASaQ9nh>GZ)LKGvCFsOr^aR$BenlcVa6&T2f6(WcdtxinVnse!>6X5*W<5}8! z;Ro01?dkETigYg>?4|wf^x*#5+QO3;A6ZzKk0U#E;!L|Wxj4UIJ{TJ~2nqp-F`9qbhSSOVAw+kpNLZ4GkFsg0W#CXd+yRL)zvIOP4y@Jn_U+ zmv`>S&USiW`-5>@t_`n6Vui>cHX>981LG*4tlvm+s3NeKdg^!5d1#+<<`>Yzxp-IN3C&x z9$~q&Gnw@ZPAn7wiM<9bt4}acLp^M{-}f&z1bE0V2OqeWsRmU6HC0nl2>_zVs9=C# zE<$!hEaohV7@Qyn@oUxkc-pS)?jBn?-mYK2ed|&ZJ79>>5Bs~n^!4W*+4_kS&1z$L zadB#Ty4h%IFk?a_F>nA!C>;R+s-hWaiFN!;zN4rXRD)wiBm@OgGc8wM7)_KA(2;3; zXuhWq5Sww|HFHQHLJH*|8-9E!2{VzJfpRJACMKXjB*q!A0U|on2$UdzfdOJ6 ze%z|vAJ`p$$5y}i`_BKXG({!1`R)H{_x9D=xn-;RR%?B>{{31#CPM`UjE#{38AgT? zaK+R?Sud)Y8FKl0)88+Pq68XM00045AM3vIVzM#l$8ktvC1g_t%S^+#C~`m7KCv)) z;_(X?`R3KNYNfStWkHHU$V7t*m>~iK#%e(g)YKHj;2~`E;RJPLX8?rGgh()$pv34Z zwdy3~*=W=o78&!z?0h4FYEo}~w%vY#XlZG6dvdDt)^_LRzpB)l)g*yhtfOpqoQ}Ia z@xH2K-`O2??oT!Gm%sjOI_j^kEKj$lRu_*~TQv!Rs7x_MRWU+hGVuTy3jfi$Q}=O& z|DkzFc_JMlAR&qxAu17pLt+wQ#T**m994#s5d|&O z3y1-7YTx+U@A=(>6I1QhaJ+K))v4S&6EDCbK@>Fv1PB^ALm*INKoC6=_`DAx96mCH z0Ki08jvK0(f+;Fj;|gI^kK?>3GBIYy7*A-W-fB&rO(yP&)~osYRQJ8BSMqu@saKQw zG$)DgZFX;8Er#79>s&ascKrCU#pU_A*;aj`c5LPNOnXWUnNZ5TXl4pTpoR#BcBtM* ze2`y@4_zDt>RhBH92)5 zdHsjAd%c|6qbj9igjBgw`>lWcd!4IyfAR50-PJ3rX}>-$Joo?rqM`=g5R4HFL;xdI zFcl;KUkcXBYUgN?v9vE^@Cv{xs97X96{cRSYX)Ty;EJa;jOEX+?gCz|KZoQ>nEngXjJnFay_ zKm{crw15DFNTyguvfxM2jIwnEXEDOStO6#+5CcQx%~UXroNyI2gRT_SETmxLld>)w*~MI!Mw^ZLdC6`;~vuyY=eIr%sMLcb|A<3k;-))CoX? zup*Y200046a|hFN2Y0VVpZnJ6#22z#-#zGblgc*uv`M4<0Nm;0FwBm%Dpzjb9OvOj zJh{8stv6QSOJDaspISJ!JUh3vyuvOD5|GHy6v|psRey$Z)J)C9Ab@!^j}R0CAuEBX zItC*&G-DM4f_%np?(9_BQ)dR=%jds%`+NUi0u7nWe8MJC!2x});I#%^#F^M|uRqyd zfBLbfXNqEhlUX}hzI}5-B{fwuKvgjy0y0E2QAYfvEDc07KowIkFjWlzs8EX=)1&=u zEK(G0)>=2OzZU>ot(oVO)(h2&)*7AV6CUc9`jOo0&73$FW#fZlNDC+X4#!yVUT?dz zd!x6P?(Ph>Z`aR1G8LVn#ntKg`Br=K_{w^<8hZ=MNFqQCgr;IUv^o*JsZZona+8o(a}XV(_NgsyYx@K{KikBH~;8+voqA*gX{nRAOJ~3K~yz&=F@kYD-$y|zcgKo zHGHMA;H70{JjnyQ!t{Ck~2GZXb-YET#mfj2bZQif_u0)R*itj1^|Pt?bQ zThq(WTz~!Tl`sGL<^TJCp@RY4?-bJw%tAmh6vzt`3j)FGL4TY;>(P@>oLE_(%G24T zI(PrZLXj$%20&y4uK;37z-Av8wsHg?SZVZXBVnH$Pj_(ad z!+N9fXfl<@wRCaj?!f?_{KAdu>GbU@ZeqT@SQ(~cn5=1KIu*-@g&*F1<;M76^S%ss zeP{pVbHCE7*JkRq_Vn@9*_ElOsdCsF0nn6?5Xz6F!H16;5q;zkf|?N`arqb$AUHDu zG+RYlWq1de`qbGyh84N=)h z0|>Ez2Q>zT$Rp%e-ooB0+^IT#*RSHNCK%-2$VME?)~d_?CevwZd{Gm00047Rtt_Qqul!p zL-2*@sNOdv=I42Yy)qH4hxV&Xn5$3z4WFMgbv067Lj z6~xL^LO{~*9Av~1_7B3rxH7#G=T~FLJ({>bJ2xJVCwhCSAII}+{onepnlHUKKO52X ziM<<_Csx+m)mBa+O%KL9Lp=WE4-ul5{&1pqPoUAATu#r=j;B|qXJ%&?mX{Y+BzTj+ z4v9#y#Bc2=)Cv&j&{+Y{e8~OS)SD%skqLlB*y|KKFAn?QMXb55y&`8CjvJ{z$KRkFxSw=_V0?Ef|@L~o=WU9!` z#?(?i=m<(KMcu{2-TO231#&x$YUo&HcXoalvbBY!bmN+MjsJ`Pd80dde(qYlekSxr zz2Sa)@wjRwTAtgv_AWMNuV46$7k>P|p1ARLJiT;(Z+HCFUp%@+)z!(_#zD4LjTbJzI;WN!nIHgq z43WmDfGX;}seY3CHoMq@sWSi*5ev0AX-Pk8HQKH|O)l#1-&JL{%4E%7nrJNGL|9oE zh0uBV$F<-6SDjjWtH0O6S}3-i_T%B!sPMeH6s6gzR_(>N-a63e2cu{;-R4i7FP0YF z#Ps~s^xD$O-1JOP;W$Rna?T3Wtb`OEwm+o9KUyfz0F99Xpa*5}6oS`+C?uvu0UjcC z09ef`lb!hn(s+KqSj+}?>iMVSwJWppwWFBJ$F1*C>kG00048W!$P`lp&IqoeY}=;{wTZKCE=R$^IVi z?ULk_L{T*kF0NI)UcZ)3J-N`n@JxDrIE9k#Ph9;eUiel&%l;c0LQ5BRyT=F9-y9~* z>FIi_nJvv1qHSO#i$Ns#5XV0|IbjcvR{Jne%ZVZ+VrB$F41gv;z>0-OgGt!V2DCi) z$lY6m=2O3V|8Krst5P<0BlP>-pyV8)VA9zh)qs64LQ0}IcEC)-kuNe|c**l%!bJv) zGsm8J^kRFgD-kblUTWv#KmcSI#KvPSynQGZ`w+#|qT991ADY}5lXK3j2q`#|z%3#5VGPKORd!Ltjx{1P22_oV0y|Xi8xVqSYSIe1&oBN`nr6w)eL);`^Zs7Y z8r7T|Wnpn{>F(ZEnudvLBVs~D^A3EWStv$DmRhSZ`RsGgPP=%?+`|6G>i&*cKnr3H zL0JWh41+-Yp-T=4z)08@ z%j@IY2YUzOjgjQfe6BctqS~6AUtC$4Uy727nh$^^Uh@EAX7D}{d$cLUr#2p%)I^-q zu|kEe{l7Bxwkdj(r(p7vXB-x$vB(xW)pY`3e^lbxCQ99@H;Vvs0= zU^#~3A;jfpc?sYDXL)`ApafN-h#Vl8384|10-CTxmq(J#@co@my*)pZMzKG0arDlQ zW5!XIWxJyx)hfh=AI(io7aGQUTa{|!oDw?~Q&I3xq@ft+8ltD3c;?vj+LZ9T^;d7+ ztOqFo(S(2lgjfqLvLn-+qX{iA1V97IbMpZ)0R;;bPtOiV8yqERnieG4V1KMSJPyfSje2cE7S6$4Wmk2+&1LX`3iTSXzZ=!4tz!)@$grMv=+q$oGVruP#-O5wn_l4z!PBto`7;nD) z_WWRHW_B^X{w`0{F*PrWI5G`=tX#{Z^HmvjcQU3yQk~bzXV1?6^Eu?pKf2fJ=KX!w zsNcGMV=%KYe&nK`YR|8&9y_rf#gT*nLBQ-mgzVu5Eq8`mG3cmzh+???l6>}T^w>B3 z)fedQ^>{V|8C9ZOw_lEgKtQ}Ab0|;?P|vI(PB0X%x5t~eYMt$BIxdpQP@A*H;}@By zPxh}5H(n~8-g$av!MbQF%=LvhkVv;?B~|xQ(KL>_}n-8fAMc-`;{buL5^MX zY2jo9h;dFuJW=EAp(p~X3cH9AF)yG9YJmtq70f^~iznxwe(V=!lopEo`1bY5kY>y% z!KZ^zjN)qb(Dv(t^laYQlTnHhBLswi8bTfbNJssxD_53IJ?XCeBrgU*!Z?GPOQfOO zm)>r6cc<5u)2kcRW^=Hg6(&NVisO;gt|~8u(2_wX6{y#iAa)J@&mXCuKX~KDTdyW- zrwZCC_P1^iz5B(_^=8+aOS8w1otSPOiU6V#!U2H-F%uwpz*r5uK?Mbn z3d^DxYuS5gu^!=6@#L5L+0fs;%oR+FXefEFTX0M4=hs(` zC9Yz*#EJ8!V&;yxDnkXJ(sJ zWO3y^rp@zD+UokLg|);r$9dXPLplU79x_BF0FcftpNYW zf{v-bQ#|`rT-`KlfO3W}(Q* z)haFI+n26(i+tQm87h0lm9}IIeALMD&|m+oAEn{`i|xU%HX$l77$kj)km@GB)^daXtt``egU1pSY?7KN{t6)JTY}+UOQHXU?3u^zA=MT~v=~D6s>t zF6#Kvq}37^@1|J|#uC|Z)ZM#x?SK5Izk2q@j|aPN-n)9WwQ^!`@5&Z1KK-TI^z!1u z>hi*zAo@JBLtqp?>J1pW8<1wCI4ES|_-FLq^`f&6OTykLEzDlV3lRWENEAI|FC*p};tKf_6 zc)x%1rO_D8*0!2oi<;Hh+1~2>OfJBhnF0YD{fv-|A)1xWcF2RlR*)XE5*csI_ajvOLacoT{xCy&&k#Aj0c@YyNEChM)ht+9uqK*;%Kb>!S;T0(hW%zB1}jR zf~uLJny3O(BtaxtA*wFZz@L5W`MIbzXT|dU0004BG*_xLjUufGC3k+Y z?M-=`Rq5Y*`P?<lzT~QfvwXWo8e&SqelJQ*|XKaH~+7HSJc}Z`+F0!?X6o^-q^abySI6_zc=){yR-Y%N@qG0 zmtKE$u(v-E8&Nfctk95Helj|Msd=izeS`x_#^*n)^;V_AQsiYOFoM1hm;-gnzYM3ZE_QBMYsq|6>GXo(YLt@`?ul;ah zyg%Vs`a^g9M&s61ICG)CSgCg2z0vQz^~1kuBooiguALrUs^>fT-tCo5It_Jc)XC>P zGX->D{4+zNB`^bK7K&W5O^T>C0h5zSy&bhC9K_h1=tX*Y`uOt5oILp(8%0yp$Ng=! zzGVAF+ShE5AH?@ughp85aSfKwtdAPeXo9jzG{&R=N+#lo24jRSid1|SY}BVtUq%@h zMHnAwf5>OoK0V)V^fBNE+i_^2W{`DV9)Z7;@Np(E9|C9ILxZB;m-`(0u zdm+=g;r8P+9Q3-cz4&51CXHg!D9^oFI7{1cW6Do9Gsc579IUL5k3UhZHLOT22p`U% ze4req4>~95INeqpMR9|OlNe(cF@q7K(oFT{IF$pL@n@giy~Vci@{HfBwIYO~2nX4q zvKyj-kQkZR0bX*D;F+s9iscg@Zy;SmR; zvk$zNQB+Sm-KJMAU}AG-L6DG`+Sohm7Nm^KohAW`JqUNgB;k%}>nbVMu;Bn9Vm2S7kdK@VUMj35UABw?i# zim-r)0#X2hNvnuN;TL~DU73rXcw3lw`ua0_-6c7DCf>MsadY$4tKD`S?*shK(#AYy zbw1p)^KaLU2H6a1E&Y8$1HU7n_^jB`hHlu#;d9lQxlAeKRyS&|cPXx`COrRJt-76S zIN&ImtFc$4YmJTh3k!#H7k9VsOs~!A)JID;I7lFofg1mty%&G&|5aUGwUS9KK2D?U zY+7QYvlx@EtZ1oFh&@XZnILACdr)U-GT_-jb>|rvL8(*sbUh}Bm_pu)+j@O9{kkVOLSw4M4**qqh7r5 z&=9aHitj**etRe0V-sfCzH_}=8p50^OsX33Vk1h_5KWRqXYr9oZR+jGb7i7J(oL~h zGXYc?Le73~exXR$m!Yj-lnndnaO}fG3`!MgPt78*Cxw+(3D!HcG<uz41)KVZKLFeR#q5qUNt0 z#|!ff=cePq$QX>$T7`VD_42bP(b?&+NR?E1DW2W-budtWvlg0@96l){z9?PsJpG*!SI36^1^b{Q7AzG zfCLfYJ`rs4W*dM56J-7H1;~psk%$m_*xE~Xj^dTY;-PmJ-7^>W_oq+4FMaWA z_7CpZNllF=4axg&y8t|`Omn_>(z`$&wNl?phxC?HK_UXkd2zCnPtNM1+37N`3b~ri zZ~g8!uDz!0@)?LtLwr+QolGs7BB&6Ay)UP2as+HD7lf1Pj_&_2zrX&8{j)#)QMG(U zn}}Tt6jq6xz_~l8-aQy;yyn{7RRd*YO)G(YUyD(@_v>Cec_pJ_h*q4=Ah z;cL(Kt6-~uMcL^r4}0VGcv6&At7!xf6ySHP5p%E7b5=}lZB_B|8|uo%zQlHLT>r-F zMS1m;efw(J-+7>BmtEPYaoXyni)WE%NxL4Z!_gt{?*i9YSX@<=4rEf?{O`Z8@%UHI z{>0U#C*OnJIWSSf5!msKo3}sv#phq?O;*?D+N3IkK&&*xrk)l2{4E`Kn+uC0V2>&i z5%?}P{^{-3?(C9t2AdGYo#0!*X6JS7y-jPy;f{`Dt(vyKRTNHuYV!;J_OZe!L)&p7 z)_5>FYR_#fEO(O50*C3yey2ZbOa}sz2O5^vs#bHZX zX&vctKX0rx$HPI>J0DyWr6Pi&zB|nqws5?I)?-2x#Lax#ZiKiAQH9`j%^I<3q*8(4 zfxJW!NCaXcbSik%T8m-?U_wz0jFABV4M8fezx3tk%(}eygR8B}Z~OX-U-+Hh4exk- zZmHwm|BvSEQIt<7p+ev++n#v+N4M}t zO_8*BLN)yQYx(Ws^6ct^C)ZzG3AB!ruBML8;|p&$Fu}COG8jz8TYF-eW6*`C(h8xv z^Uq#=?blyF_wlovAO4Ya#HzvtR%GD_iwWYh|J7JRvIr6&dZFy?Ict zHIfgu0u{MQ=1$X520oxiy{@vna)s0IwTm65g0 zbM0=ubbbuJ@4Z&2rTA#GIjFMjxBZ3cFaIB(c8x*f^7`cu{_3dpY25rrh1!|hz`*NI zzq87#>|`(L)V1NVQ0?iCo%TT(faR_jGrUDQiU2Umwu{Nm%6uav0fae-NgQwA+4_xZ zJ?zZdi&5fgQ`hQ9ONC^feJMVaD%Gw)WM<#l`R#Fg=U=Y<^}iVA9s(vnBd1=(-f$8? z6!DxAuduj%>+9dRvjz3UTAw*nihll9wYm&#HJN2qql4;nWq)_pF8~O$qkTIV8V3(t z-#&QHqt(ilk(l;NW2h@>cB1C|`KN!hO|^}fvpnlwzQW_l_OJgk<)M4-9K{Xg%N)Ed z?Aq0JnApd|{2Oxw{lWkMAOJ~3K~$gm`>UULf8+Pg)%FJS^UF#n)|Ydwl@db!p?Bzi z_YZmZ4OD*To7dyTR(-BH$p&!K2-xzDuv>F{D9KB0v=Nkg^8g?Q#KOArfPPrO2~AAjsO&bf*6^_APb3Tr9cSLulsi%96)6vnv{3EPYBzNrw?(uwjbQTI){^SyHd5qC1@?JEpFs%m#&zZOAW<|_^XwpP!H+k-lpZVSAUsR1K@d%`a4XCQ0bza|=hZ5Tv zkJQE)!l1$2W2qn@D8GH%jVl%D1mNuM!C`mVTzc^8LytE`H{#NdZd`9@Xe23`W;{I_ zAKX6L9a=}Iu|6A`L>*1Z5X=O=dE>AVsu!;QMRWF{&pvaw`^qh!%pXodJ{YwcX)?E< zSnT}67ysM;OaI|No*Wzo0004F*{%Mppn8P!DK9nEd>b#E@e+AAt_^m(qrKYTtNG~H zzo7j{0VdI65-lq=2T@yelXYEG4OL4?3@R2Bg<9)cm>u8V-?0)C;H|7PE**!RQ1!jH zZ+5xwooOgU3Lfsf+C4cMUwRm!xNY}_Ab6Jd@`tm|_kp_J(M{_#(($A1f7F{7D1 zyU|+S=qxWxZBcP>TvcxJs2l%$BOPi#rr^1H&8u7Umw$0${+}LiSFOX!gg~>&C_vPS zA*AW~D-Q>qaAB_wZkEHtP)^=DBSN51WHdRNKYn&z_p39TvnM{*emu?Z-0t5<^5ewY z`rf{0mf9SUanlT(m~p9B)B1bo7dl;tR%Y0-Dh6c$H6XIqs0@Np3Wc3uXvZDSK~4sE z+>36!-n?^b{;OZli}8GCv!0EwH?IEZ7m#h(Le}{K#M1 znPx@_F4WXQJzZ30b6`3gwFFzJ zI}+xUQmj#Ft(8XWcK2>Ls=EL~i4OC~%T{oG=VssPB!9~z^}7%4>EZ3A8`rtfrVo9> z*SdqrWH32atSKAEi(N9}l^SH#B2E6s`QzoA*J$wquCFg`Y*d_Q&M~p4lC!~o+JuD! zcbpTH{ZJj%&-^R1`uA?<&(3OFMdUD*$+ff4ik#aH{c+(4ST(Mp=Sp|Kf5qg9d@6;g02GDg>; z(HFP!U;j+328fA31gb6^5f}k22!au4!$7PwqE5r?o6mo3XHo^O%T6 zaDDIkD^!)*We`Ve=gz8Fs^CjfGxmL|9&6}#Md>ZowEy`pZoThQzjOkN7vHxd>z^(c z{wc40HtIrL6J?hld$Ky%%e|fJrWK$W?YFA&Y%+cGH&@?XL^`Fph3UQ@j#Cw{4?efn z@oR7Q{_y{clx{7!THBOGIh{o}ckq?hl2D|Rp0<{oO7P3RX)|!ep0vz0Q|k=9jM()?&S_j(ho)hn_PlbJ?`Cy<-FsI2C-| ze>%$F`g=sQZdA;+*_XfskRT*L%5Vre@t|m2yS-dZv6>wh z0004G-~9CB(Jwu*^7qfS&evn+2&2xIZ})Dz@p@cSMKue<(fOr~xLK1J8ZAqB$>j5l5OmivTk#L=9L4dgFP@cWrdR zEdPkOy4t(Ll}jG_06zPLf2+>EcYK2WWDCgSn|9Cg1C?h^zuwLcAj|*}p{B8=Fa-w0 zN~{wSP%z@!D8yS9j%N7q8C{nxrel5Qx_kYL5+xc_rS;6-DXRlSh&4sXS_A}@Zg{nj znDZbA=tTk;_Ep9_sm12@ZSqB*X-0O$zWUbQdy7-O8lFhn$)ir?eXus^u158yb^W;2 z)!6VJu%=4K>C&1?>%D{H2RF`tYOV3lKKR(bevCfz)W$!&yz;?r4MbDad}E^j=$Wsi zu@mGl8P#X-!@c9Vv+E&A2BVo-TD|0^PhS6xU%2*98pU*L|0p>7y@HO@_`QuO?7dW5v20Hsv>df9@~M zt7x+puQ@*!38)=V1lj;Z1QC!0HP)I1B0vn_5=H&q>y9TQY8;K4m)$@`$7Dx$DeD0E zJ>;1TjNV4K?@VfQ&3Av;zxX*&gssl_^%tOb5U;OWRZz+KbmA{`%1-NjeDZVYtyY1< z?3MkOcjoHtmdF*Bztf4g=UV^U-f^bP?qrtR&^Q|CcI)Wm_{m2e6gTc|ZBKlf)?K6+ z)>b0s-JM&?C-XS!Ob&}IcU2LmbrDfQa_UX{Cm$7p&7y;E&P}!li*KJj^uC4RH(b&- zT?ejUMGjnJCAb0Us6>p@7P<*7CZ;zH`<1;qmn@#A`k5Iv9caZ&;uQ-Ug@`Ch9D*`t zX@hHP!7O9$a1^L4qphvh-rjU$?)5v_hvwT4PIqp1%Sqf=RHu0n{=h8?C?+?RFPS5y z6NNEg3`&*a{3LGd5KTB#r_-lzJ!LOjH$!HN$KI2C z^>fr9qqG~0#xH-Vd;U>srT#d}vU04_u(Z0$$A7JL>#RDk(BJyz^IKAH#IokYe;Jvd zKhyZ7-sFv}8d7xQ&Ml;LzTKFOXEU}RfBK2>?Hj`)G^QSXs9Mp=*$am+zK~B`qWt@p zZcWESS7vdueVTy$iLSD`*Bq11i#?a`0$5;S4v0#GNvur!0004H=)J1PS_tZ-)5syC zI3U!Zs$fua&OEXqttlM@JZ)Q8Q)&%xHc;F^qnHgShXe!!6i}qvxM=bBO$(=u*0C%f0JrlQIX;5T~*pMPC`B55qKUH#-= zsbLF_a+&Wk&p-^(jM?d^4r0hpl6o~)qs-}{Gc#YG5pP?YbYZm{O`rK1JpbETgQyt6 z6z&ATqS7oZU_kRUtA^~_d zsci1a2cihQO!r;_TbPwiigi&HaU$MlW$Vg`tf#fs%KAoUadkKA>Dsb!ymROIt=rEl z87s&pQT>}I+le0zufJTr@a0OM66I4_Uz!m#O?aU3zO-gM9!gQf^qxN0QJRlXO_C1 zktmn86N!4gJGXCsnZvP2&Y+$f^~CNM)7kKA&!V$uKKb;l%t~w5*H)2yE|isSuzS>h z_2spN?)z{2j(`5yH}-eS%0r;<9PWni2-WIdO+sRZFxyo~3KE1kQY{Dukc~L!y;80u zGj!(A@wSy&9zSx%f!jB_@XvpVk6%|xNz@W{v*NaQGY#4(9iah2k(ik z7^BkWd1CyaZ;rM^%dz;WEr)j>?`|ni?p+`VP!wZYyEGh>1vzh|xpWzrgvUu^fxNDO z0|x2LH|M*SK(l@_4gbyCp8B`%0004I$0Bq4$ zdZJVvvgfOz@wBGvDH=zh9fc$tjKRoH2 zIhQQ7k)&wVvfcf5cUg9K2V2)Ga*erkIH|rGlIQe!T!<%!uR9z3#uG)7vKrr-_UFqR zA789@TnIJXEymNx)^lX+W_eza^~6h^#?=Qe0V!HL-<$NbXH6wao$^sJ95x#5?@PcP zP&9>-sRvk@xDaj%W?D_zNNc6ud!2)53J^R3n~J=zOx5sz?tl2y=KJPKia_cP38RJ* zPdXBA0J0zkVUSp(h{{oSC`1@r785y)6TY;PKtSggddU6$ z#>4d}jYfT@pp?PyMnC)q(O4r&F&VcLBYjLH$ z+56RhKv6A>wn8~HY2!^K=AVTYCoB@mec*sl5k!n5mNwBz>wLFPG!4v*UIa;bR?cFX z+Y3MQwx|B;`?2mhEQ%@_>&hSjf=Wb1B#yNbh$3dMM+lmE4jDipLnX+U)|$IBZEaq+ zrAvBL&7ie>KL?=#8trb0vt0J_o3ER*XR0`9KJs+;;U{GOAXYFMkKfq6F|6d)+EZC* z4tqC4ZRL1)W3jQ+T{+vZ!=2Y(KBARZME=3kk2KGm+1=f}e(Txg3TrGQ@|Ht~>nro~ z#8S;hsiwJlv&!?q@`El}IqS-DI(dtLcQ5TIXhC%4vG@t3R>YGOS~Ufnz%*_f6Y-RQ z13Cuf8CcJf@&i9Ie|EW->4!<2LWeX}kP5_14B$woEWv0b@>&IyQmI6MkpPjH1r>Db z;)BVt7M?XXA1q z(%a3}mzF=_e2fgO+I-r(70@BOt=C>c$vuU{B)|C0uf3yf<`-A5tem^_BOjf8;qy0N zdtGB38)G$Bv;5{Ow^r5`=I6TIB>oLIKiK@a#qmo|yM8sDv=(bDf+)x$>fR-N0GyV^ zY|Jus0004JKcJ@jwBYEQTyETFJRq(LG< z$nsK0{^$PQm3Mvefhd^(wm?b0GiDYgI;me|G!QBjtHeg8M$~&#?iWG3b}*Sv^O4cV z5`^vGE;!_OH+r4?1TkE5kQo+ z`e5Ic#rG*&6FD{Ipy~vnP^yNeji!c+o2x(b#O^=-yQCnUXz41|L>+Oc10;X~k_#p%ifN`yDGaPsNcAtj@WM|&F+RUh4`J%7 zal*vk;mmOF4n7Mi#R8*)o!P+%IF+hw6?wM(IyB9myoWu(}ym=K9ld z>Kcv+#R}Ir&+ywCDt-%M$f*dz9=`xRvV#ME3=8jVQBYh}RFU`23yasYQAr^xii!w> zMqmmQ8U`PzwI2Iv`{?6kc57-@Em_e9kcn8OZ72&imI4DZha$ny;yO)kVy%Jg3keuo z&x4!XmT%`pf2Q)x=?nYvSU6)a%521Oom6Y{Cw}t!wg0KghDs^V6oW2v$*WK~<(vp( zV5v&jdLV-BY*U1DY?gE?_5$n|*sceh@Nk^k04FWB7c zF_Tj|z0XqabTT^G*>U5%b0wvteLUEix`}De2gQlP`h0!1Gi#>0Dm1Xyq`eNCCUtT5 z_bC43?cqAB1u@_W6}>h+sUs{U&00e>D~ap%-9dj0P5@!-9(e5H!L%o?gkZ!5sR5NP za7eztc|t@1q2MU=m8t-{pfy9RT->>IdAPAYywwX@d5WNP{uKSKL4>E%Z2l^I;up@e zpIk%pFmN4E#kwO9b7etA3XQ@506`#dP;m(q5G5$rikd75X-^g+JqUIz6cCfU_8Z?L zou<=eZS(x-a5|Wteb-|Ke6+c7_-g3`7@JqS+r!xiRFIC0Pv~>hIBYx^5<5P4-lwbO z+>_EIi|e1y4<3v9?^&6X!2lcTX4PvXad#T$TovG|fC~Hr=Qi3)E9fh?uvnC~Ni_~L z;~Uw@5p&SWe0#Iqdl!hS;YIiCvMWY+Ft(2kGm?SqUK#>9aq*nht8(nr(Uq|p|ZwhI?rh6 z$e}REaaOHfTD)*M9``3`#`XG1vs)u0N*L7&Q=z%1AZDp2%{dht9h@+k+90j#!GhVwep3pigSU4ox@s7&8<*1tIw^hblTW2m zSopnT-}g#K0TF_m7>Pj*xjjGkmp|?wSga;gy0i#sRjCp*1Pv}Q7+0!14;ck7o)AI& zB%6gfxcZ*+6{*Gbx@nzY)Qd1TI26eg)U7)bUhIOw08932nQ7{jWq+jU5qX;M(Z zz^bZFyvv+>X4EgdtjB3rDNkGqjAt2OV@{)Dl$j+Y;ndKZFd24U6$#KP!M2!W7=QIt@mNK3ZmXGd?!1>{X-)DKFRL`F$i z#B!mzv|ysApNN0Y#nRB^VW){)84P#fn`#-)sBZ%i} zwYgl!2U^AvjsZs^z(L3ro-B)iPTKXhD=Gwv)sez!>GMB*EcRO>b4l2i!&|TBBj*-Y ziI_vx>~37xd~joKqnAznV1Kl|-9IVWQy^+UQdh}J(ixPwA=1ts`rs>feLB8X+PS!~ z09t{rq$C%HxpdNYjWt23ltLB|00I&PAvDYJxPKx)KstJ=Msn2&OHUvcfFSw&PrNIi zU$SM%mNIWD7hFImDLYjb=o|pCQrZWY4Z`X}`oH?W-?8@CMpBPK58`AwiWiB!P=-PZ zjAG-%{^^7^Xrt=wz0r_lPf6*#LqB`7yZJ4vlY700(hST1`Qgpjxx|N#ZW3ZMFU_5o ziv5@CD+{f)^ZoI`IM1CRMpA-IB`+|XIEP?X+Ud>7-pg-XPofwRpB{em9%kX zsk`3kRFzMXT2n(B#c|Sb;uN!@N?XT4<9Jf^j`^;^;amTsQ3M&F7`#HGft-wrHz--= zxT8acLWsyhSe1p#+q0vVE2Bz+1aY9eoJvjvb2u}vf9y)cnql7ytkPX>4iua){2ae9%RUSwXeUON;gf zR0oOQcK+sm9A)n4nMPd35-9PRgn=vfXS3~Dv0D`DISw%zp@XLL>k|)V>;#l-jJ2MRHAMFH(te7;{u}p1f*UcAk|Y ztgKfaqQFv=U;`1eb*_0~PLn@AJem#1Pz}-h*2+R{(SVLbbktm2KDS|10CFNEqHHyr z^zQ_!JdeBu@x(TOmk@+Vf{$8F6D2d}xz%i7eCN)7f0mC3a!^I(;!f9- zUk`SMHnX-QU81Ur@|CS^-8N|?#N0>{1kFK61cP|*$ydP#oSqDik7jv>e`>Yhp4$+W zB403#H0XR*RaQz*l~W`k2n9{70wFM>77iq35zh+AGoDmr0{|;Q;MH2%Qj`6m%d)^# zt=(EWdlk$Y`An$-K%6w%tLNfohg`0hMNn|pz)iSMCbtM6vH}4x2iNm||64Sh`nv;S z1mp=ZGPP!R^}%<(zf)5u2YaB?stPR?I|xVCy5nAb?rhSUvqFfG6?+sa3#OWeJLBwu zv#Uyz6_21(9S3iN_uf_#9D7%r^=88p>)rh=YXMNF>}Kw7MV<3%MfL7uPze(NQy3}%TZY1lwNwS6AS@7cVC0|!6Ei9nv_+I#%yP;ro_dF% zBhV*88&7V|1}AQuQ?L?8^Xuo6^gI$0oq({X1nTp18|R6|dY=;w z!4>l#eKdODiZ3dQb8s3ALk(!4r~rsWY749DY)kQ$#MisGQ=ElR$z3tpTaW880xQ5O8}ajBskUF2 z?Hj^^uJR1nT1)FG<+H`LGwEcIji$K|Xm}KgekiPS4V?^&Ea)Ib_44>&4FIaLlV69snU0|fQ~w5`JE#5y{ay52`bW&pHRQQ56zq3e$yPx$YVr(9DX@uJT5I>W53&&K!C>|5d8*3CHqUIVuFM4;W%g(~ zoM!uKIyGDcZ4_Z_%%~`pQPbY6)oBU^U6s0C=irKyMUyN1Xn(e= znl)Hohy9c2@jqvtxO7yE=4&5lLb21o_2l7~cA?CLYBMi>W+aG%P%6y1Dp^LBjwjWb zvzkFebr#@<27S6KL0wpA(Cq9-OR-YN1{)G`bn%TMyzkPukK8P8U)oN+}% z*qO}$03ZNKL_t*18;r_>UNdbiJ^9FTidWB{84r9bt9se^sJFXbKdxDW76YkcIq35-(O({XvLXoO zj`#0`+Iu_#1AK*%P!4g|r5P_QHMP6w5<^`gDQjf)qnlO7oravEcZM@Qqm z?X^n}tS_wM(P3^}tm2~=Z<+bd`70L>ZXZ~32nYzVGET%&09UcMTvcdvJ{aYhh2{HO z)|y1j=`cevxgKoM==i6evg4syc=z0;CpyKmBh~TH$Z_p>UayXJ>w^(+t}KQb+n@je z%8GK9iahGtNuQVj6e1{r({3;dhtrM;Gm}CHs0@l0D)y`KZfofx{E#RmB7()W zE>ltD(@Yd+>;Ooff5FWytaR4s=+^XLKZ?zCzZb^k{Dt*+Jli>$7=zBaI5M6o_qOgU z<19FDU4@yd^#`4BE_=tARBGp zcdtsFQg8ua);mtX5tE{TOvGL|AVY0#E`Sy!5=QOuv6j!6r!z#-vMav6g~VffJ^f%xF5XJ|xk7>TlJX>IoLIRNkq2 zjos@7gl4AUXqZ&I-i{^v&24kJYaZ;8Dp@OENg6}4GF(ZPszK&Jt9bF~vk zE^e1m8U$-T$MGz#3e#Nk?|njdmWNik)3pk2ugdR`_dmo$GbUmHAf-YeK@L+#5*XP@ z<(!0}ugcIpLv%@-@HpqS272*3g)LWo|}V1Eb9$46iJaPQSE&la>UU3+73 z@qq^h!(OZ1zKXcT{^gfmjCFiwzu;Edjbw5!8+kn?hPwpAT=BfZBYc83J4K1D-zZy8Y{8Z`;y6P9o=Ur1|Sdx zsMuLMnbwGaK!Wuo2^XukKKE{K*GBt8S0s^C3gXtnpx3X8!Zf?X@n~tS^NIJp^D|%g z;>Vu;&=T3*n=f3fKQ#&E!O@rkGs&fXgz*auR^r0vX>Nz}UE`5EBT z@WNCBLDYO;}OcX1lqgh(V`l{e5hYL6mD$sx+EI^JXH_7EtOMiIXLcDtkV9(_1n~gFp zi`%lH6x^==%}wMW z=uFX4vwigXE7|g=h=I2ozW2{wQ*i9b{R!|eb2;;FWiPuG{9^&0q@l*%$h8U6v7_}cb3OlzW@LMYxO&XiEo&X3HW_9L~lcB2b6M=sukb~NoA8rox>^GOz0noI4eN_L{6GF8=K zoB)X&nQm+y8EecznyQhSPey!F%|wKdgwR@9-%Wm|qG5--^Mfu)&NkX-g6ESi)(sJIfT$~1_;E^3)qPgoeFiyg3_^44aYOj9^QEG zZC(ffm;nJ$5W!gwh`}%Zvk(5lN8jJ;S+e@i7L-gFnM;-OuDfoZ z7#T?d(>QWm0`$pHV`=I)?nsWN`pL-`J2UF1Zh!Ml>&6zB&yDd-f!4B8ExdSQrXYU> zr5F_HPs-8>CL@+ZY})oB_=a}MQOEl(aLO+Ac}23wlH|mmG$1(ks3~vf-G%zdmhJx^ zYi}BBTXx*{Rjsx5aOQjNJiWPJztxle`+myVpN(=kw!(19BEoTNtk_EY8g>eCW*bC_l5eyTeHep6bLu z{d0eQtvATO@lAO6YVYfRP>Y*Pph`cVMt!FDJ+S_<&SJW-Y#I&bFgWP1oPF><NuyI!b~8%s9tjGcAQU301C5#Z-{j#04Q4^S-%8VW7E$xjSUDHi2~|R#fT~euV>`Hg`$H#RTD<-B zQI?}htUqq8E_d2Xj}$pvzWUoQzoe9utcSi>&AoH|(+dou_r!d=rpG~}XeoyWoS{%v6*}qE zIrH9I7h*e%s|shx3Z<6n+yDRpZA3soFPd)~t7XgWPd)R@0}tN6``R5r811|D)=Tvb$JMYCXKK$HM zKk?w^>ZZLWF0XA2RH#4@QL*>S3zPP-zYMeaVB^*(92Qn04#jFuA!CSb-RSwna%-xV zwxF9ymn9SSqI+{oH@*KsFa|*@QGg0S(q8Xf@3?Qr=J9{{+IOFQ;lMrj-oI(%h8GUJ zn8fOb9(-#UCP}GMxV1|Qh60Fq?(_+no9DFWdMTxi?)bGcH~sMPxg~(m)YiA8a%!P_ z;>6^M$(fA{&-l!HMlZs`s90DF@^~1OO{k0@I50FCh1=uk<6r&8mOa-!aQ8i799+A5 z_s(l~s%G=n+umfVRRnx(XJKC1XRq9x06>;@<=pX@8sHM`ti>*(*O9?;$>~f?5z;z$?o|~I`^Wu@) z-6X8L=EUx?BS({r)5sgrEQMPoU2 z_R!F{|DQiJJnYYA?N(HoSmVC!6$22*M9VYr{BfOlon{oZ1dP#I$B`N_Q1T`N63U4Z z(aWiC5@yT{m`8f?)a=}WBkSMtCds5AoD>Q%HQVin-+%wRAG+sLpZ?Mp{{DM&^X+@y z@}{5r@Q-G;?)+HM;c`h|pip$UGDvrMDY4EwOGuDQebaRvDFwB$j!NcR?G5##?`u4V zBb$1AN(YXPXYQ~l1E3fbFezjv7Brw44Mvq}$p{;LJ@LKl3B^zO_0s z{tsXJ`(J+BgSOGAZrJKkf=gvbi>SRC>oM)j!rV#9dyILO*8|AJw}dl>EQ|sV0hvH` zh&+J&YEmNoh4{mv8skht=w+t)PA|%4VN)!r6x7FLYZr#8ConOmc>YVPj)48Rd zi7?GW&j}Vb;V{3pq=y1x@2f}F72Ibwrsxb?2Es4=25qFN-+zC~lARltG_`npK}{N&t!{iBb6g<{6lV?Ta>B+_eJNM4aOxrYLVpMpk z9gc`tw6*5F4t0Cld18+whNu}O&!|0q?3!5A*mC2<$nM?;e^Y(zH}mBuyOcSEq9NUj z6;ZU(J%^~kTDPHOHqJLErxqT5`#b;B=RQ+G6PBW?*lRl7R;%kNj{;L1zn!q>jv%R%2IDA%uU{IACbIXato1nkc!qu zrBn0cw_R7+P!lKUkw`dqEbgJV-}lFV@)zIv-qXMJo4<*Mtj+Iv%bWM!a+?yj``TUA z;Tk9exVU6%b)I%H9G1w}PaT7~1!vpb&RlOUjW)h`>(4j_$hugrU=Sshq0_jobLKcs zKi`BvR59-y7(_{EG}eM32IVz@sPQo9cAH zYsS6Iw+Y)lH`lZ!9I6hJj!9TF2#Hn!IS0t@eK$oP|I(?akDdMb5C2?Zbe6U6zT=K< z*KFT3OuKH}hoskbcqa(~7Uz9%t}*4m|Hb6wfoRM1Tpm|Q3Qp}72lB#11R+KZ8a3^xck<;+Y#36Jy^=J^j#0Vb?)rs|NeU)d(V5{b;C`!2xsFH z>woBn-sbb{#+$Ai85>*u!UDR;$Lv(SUzqKkIjPb%bXr-r!#+R0=f~^GR)d*$ zq~cOIGS*GQvmJ?!Ji6?eMJYgL5kd~c0Mv|$4T2ap8Xav(^p}qv-TUTyn%z#CrQOs4 zn)~j%XV~D4H{Tit2?7G}Yq*S8FhX2CELe<%&ojGx4=ui$0qjYMqO1&(xjI*`)|%Rizefx%(y%!=MoalmI{}N#6U;`@8Md=fC*XZccaK zd1tjY_T6tkcFW%DcJ8{iR+~^O=Z)~9{2Q*wDI(;u#S0!fq8HXJ zGAJCa2@o|ZG@NYAwyMVPe!slb*tToi#8Xdft5j|pDxGRB zUSD#PXJ_+PGaM@e>NSmotKkSm1A6bQZI|ay;QVPRtq)3h7A-k~mZ|ViGP--~`~j;= zjoOBMs8%|7#D4t4U)cHJ_uum?Z=ZSbMEBI(x#!OLlf98joSAOa?oLln-?{I$(1bVK zI=pjN_27ZoyYAWkrsom+fhBoOhUwD6-hw;sjQk;cl_<)<9lzs?E|;0YdrGt zAb@5&oy+WWo~15jG>IUicvM0{K!6COwo-a#YHsgsx1D|d`Rn5HMy00GPEZc!XXiVu zrE+bASSfYM=&10`+&;>7$&n)9T7JE+*SjY<>tNbLWEYp9I=ZaZDIG2>A1>*oqEK(Y=4_y;}^1I*s$WQ)v-`lk1kyCS@K9*O4;DFP2@9r(l&sN7a zt!?{g|4PUp3VK=BaaT<~uY%A-<5~S|5<<`>92#ntxwfEN^|^`NB=fL&O!vA&$6M_~ zUpl+(4)dlT`)4yx9SBC3`R*PNjBX$Q6;i+aAOG~;d*6Kj{r7$A8&B+i!p<$V_aBhq zkuCf7`A)ktF#)fm4QQpxkIGq_x0}F3Ld2FhPlylXYDTR)+14{`e*MSZ)&Bec*XgN@ zeLc?>Ece(lfk8H)2*NCYk|xj4A$(J*^6boH>E1iSa{0lax;=MW1Hv(A8Vv zgKr(5otw+^tWvH3D8Sdl%@A|e?Sad^7m`#M6}6|zTc0cM2x}8J5AAlMj_rMKBdu0H z`5UQF&u1B^K!?I?l>m!nM=CU^L6F(sR;~QW_rCWFzwnFK-*wk-{Nv;0q*N{iL+$+C z?N+PN-LMsvlGmZwT5AGuox?6C0RR92aNf1M-epYQvC~8f7+6pcG&-NVp6m2zEE#p2 z84wM)40yD&yxeXc=q#P>wk@G&5&%zlT4c{P*H6#P3@z3_yl(T>2;P+1!-ozmx7r0O z&3qY5od;+?C@&S#|JZJ>+p=9LHF^B#FHLNF z^YF+mN}YK6`z^AaR%@l}@CSiX_3CbJfEslfBkOag^pS5XrHv7Dpzal}3_=ID|1)ai58nmclM zxg7OM)k?eB7V;~-oG7o$28Dah^%}|n0fG09l#pmeqDZmUMD_Z#Q83r8lQK&9p%zK z>Ii@|I)$FJ8`aItGQXKmPQam>S-yv5AM&X8+B=>1s+=oi4wME_q69Qz&5d2t+Ixe< z+6d<^x2Jlve>wGR4^GOsTJHJGx^D3;3Rfm4L`DJOwB0b&!$XfLl`2rms9eZ`?*tib znb&vJdU-g!#V51;tbGX5C;ad?$F`K4*f5m2wodaOpMECmwgG^pfOeM- zM_=l?KmZ|^b_4PF!dHk`#Tzi}7_*eJ?j_}D!xp|~^WtMCM>Z|b&Ziqkhra*mrN=+_ zNALXCKXk(_+m1YbVCl^K(i5{$8;3?roaNAJw!7(ub(^Ngj@-I$LsU{5Hjb1_rTquz z>y3uQ972K|Vb+n%I7WG4j30F*oC7${WO5)GoO=)<^FDy6-Yh+R1dQEY?#T(8BT zwMG_Z&_XNUkL>d9P*R=(A>^;r7dIvAH(K9HdwJR^hoc|_mohD`Kdeb9#qBB1kNX@% z#33Z=1^@s7alfg&*?;*r{_MdY+PLY4T}+l$NE`xJNEAb)gTNg7#&3P>RD9hXx81z! zi6_2)B3?S%%aySQsNoGd!;73{{KEQ`@lo*2}PYcak5$~-F^2x z-+gZX-g_T3QAJj#yu5Br&KqZi&Y}R3MzR{(tVF~hgRm3FoC#SY-irqS%|;Z9kSIbP zlJbVUdjLzNl3Osp_le+Ku;uRCZaH%3$aDLjLuGEhdGAMl`n|2iW~l}Us%Q#Y^MtU^ zVdiOfzxXp9=gmF|ZrVM2_H4V?x%-~GpE!2>zJ=w=#75{BeqY}h{K2e@ytnOUk{ATX-~4a>_zN6D z+hv%LHXdA-Kk@XT$3E8{#@aRh)(?Nsc_RRtE5r(=1c4|o$craG_sq9i>cell_vDdd zjmD|B+%@*%i@mO$d*+#EM}~)5t!A8*it_H|s7u~Ufe3+xgb0L5it{rdVO%POmBq%9 zCRoi;2VDlrwHiA_carK-t8SF`nO9)EGDiH@&voDYBkvj=9sk0Y{;sjOsDjd|$*G_J z>7P8eIKO-SdIVn0LtmFF06_C8?Q#!_J+T;2;~04zp|?^r|@ zK;mSiee(^&^Rs+vnZG>a?*FN`3=a+c-RGa#JCRIfSZbd>wEytp{daA=rr;-WjScYS z&#Bw4E3r{|1fKhH?;D?D&>io+>A|QKu`+#n@;`jNSxIQ3{np?3V2={xJ?oHFL>wv% z7!}4@@7Wg~`|kYBZ+XwIZ96~x=|8`IPc(hHBtdlS$g|_4BMS?Q8#iq$1|z*LQ(Tdk zY|eQP#EMwY#Kk0TL?kjM)Ds)w*s*%AjU05)8USnEjYc8J+}uNYaY1o2o$ z9f0!t9(dr1C!RQX;04g?(1{a2{Zk*@zyF0@H{Sw)0Kyl1_v=Nmqw;d@%emaTR-BaN z>2J!+_r-|Iyz}1r7KcmG`jbQVPgb@q%s-V@Y7&M{KqDj|Oh||pyrNL0-}%b1#}{;E zXsBE|e)4#2MBjevy8r&4@A{>WZXFt)dG@J;3-jlSS)c&;I$1{nF8}}mat_EV5f046 z=$NlJnkPJy#TsGOOIz9E*6Ku3Dn(%_h+~Z!6_XG$vPoUjXQB+6rRioIMwOw>giQ^e z)Dq$l_#R_d>vb~u{Nn!lul^tZcCrW6^+V;P^4yUV|K?x+i#Vw~H; z#O06vE`04+_1c}Ar#lmeK6dQ4|EHyz&rMJU_6T|n&jVe^^oVe)xeys!DMv|AG3Am{ zN`n#Y#WO2{dO#=Z3^Oh3j+>3`yNrX@Vf>tJUCN7!E@aN~-kIpRCM#et!?zi9fKqYIp<7&02 zF|IJguddV=ZG_!U94gTwCSdk<|2L@K5vqjO>iqc>;2`w{ga>gm+z^L zZUu-m13{ty7*m8wB<(YgAOFd}o=W!YefxvgD+A29ee1T*eg2Vu{wu#?t&3y5`hey2 z9wEc5+mI~vq&)+9@~lKav0_6CwVSPXCQmn0n}a&tsBah^9vz)HcH;Ez@d>C@RhpB4 z7xdm5ZIIww=h}a{SRdN4>5jMDi-te`*t5U1Y1bCTfS>_aOZuEOoqz4u0i zN-Ny8bLXQ^9QxTey)B5wL@AK94}j;9jXqDqK!cz!8Js-mrY3!+&FH%5#$7yIMc$yB z$I40PuMvEhf5JQxXl0?Mt>9fD|nZsXg4L$sxABjsrv)#Ml+C80m z=fv?-n>TGMm8xqn8`?SQbkT|PNW{Ped89z0Qxrlt{nQKXxy4jLmfL*3v2Jwi#ibK5 zgz@;8;cK`qZb3!kTX}?qoU0u=^<6ub#4HuYH09k-i zhnbcxbLz3D2!TR@F~BXPx3b=ZZhCpf*gGrlbh~2`dBv5&&TW zt(Knn-qJsOt+aEqjiKvJZ)mjf#N+4w_z$&^Frcsqibh6a5L!JEvXWb_R(RJc5*EX= znHg9BUV(m4fQVkBu0Q^Nxur!Wq>h3BtMMbp|J9r49{XEVM#)P<;|I{uOV0j{p=Sm^ zu9!w!45%*l4ZUaRDsaMG;2gj+v!bfU^(ecP-X(3-{)oh>Ww9;<5oR_2HANfV!s;^Lb0JsV?NLEe_t%R0B zndK5zLd%W3JBqE^BlbpWDKv{8X$C!U;j!oXtbsmG&k>Vr~g z_YTr}p0lQkPyX)jFMj2#Oe8srb7*tSNt{LRS)2yZ0K(`%3HcS9xx7qPgaxeis1zau zhykDh@xr-K&XhA}#SfmC0ebsCr3u&qSg}3mO`FB9p6h<|QP*Ae;F+yw=g>z1N0By4 zfDwpEm_QIw;EIqmgPBF4d@O{Z0ThTL@Xi3XugctTZA9CMpIHi6eH78F~7QI(Z`R z+Ul*>bGgzasxvmHr;q)QzwR0hPII=-=NZ|YokQn@ya)$?D2f=7G4;I_RvY*SQo9!m zN3GAM4m}3}l&a-8OoW0|g}7P)a;}TMt0N^W#wbxS^9hg=!l>f1#ulLl$jOAdb)xmi zpDx|~(a(S9z=7wEkB^Q#^u8Y*U%#z3yrEJlBO-uCeEkzq5P(@N9N2G9ACqp+^*Wq( zB(v;N6mp`f>xRtaqMo0hfAM&^9Je(`WTu@Ht&aTG|JwY-A3D$myaX#n*dftP39=QG9yYExsaHUcXf;B;;*qS}Ju>UEj z*QML`S?co+UG2Di;0AN#vfL?G>TCi=nLa#AY9o`K|&#i1j53E1XL)*%lEesdu>UM{$Q8_ z?!MBM1*JIU@03!2EJ`5=popMHU<4Wvb+8h%wl3qMu#$6qJgHQ1ymwVc#Pxd9;7bz3 zLQ4onNu@FWQEGfkp%#Rqn8bkaa{ReEk&UmAs4GZE0Vu_VGJppF1_mJz5hMZS&$CqV?>^3=S%g3o zD;Ov<_6>3k{ampNgM~6FJeLTA07xKAz@iXpkHWtgX@IeI*kei)JqgVF#*Sr zYdP0c7=ZT*r-c;hP9oJ-<9}!`{RO!$7T5|!R>{@Dn_BZoSd@j%!=fk(1sD{Ipa7t@ zE+sUG3Pb_0AmFNx=uge<`@VuD>2uu|nYoxtiY*MH1W+kdI>149PM(~SzzZtukaz`N z9E;qc&~_L9JdLM^#~xBTAS4C)Liw2aJeucnFkTS`UrLjT$ppwK3b8lJ_O`#Yz+a zveG6!`_1;F9|%l+Y2C+aZ~KQ3LqTB1Vmi^FS03z%gEw%{ljCCC8>*L{W-++}DeC}+ z$eOhxnh#(bcyDE!z!0|{ZKreP@sC8w7_h)<+w5Q}bme^Cisyo24;7*=k`#74|Ajwm zf94CAl!ia@v+LgW4iQ>OSP+m0YW?yOaxPjg`Wmv9=L!2*R78|QrH}yhO2SP5tjMtd z3L!VNI0sFXCE&n&F+sxFa|;W0c;elm9v0xfdGssw#r(;&8W+vXMGlC1r6(H&5j6ud z0czF$)>qH{r~mAZo*+(7KJ{ez#bQ0H}u7Ds6ZN5Z}V2_eV| zhd9tO#aN(c>Y@lKQof;O*~@yAWdPPL$PH>g*P8!$GV*Y#dJTw1UuedC9V*^l*vT4HieGNVh-j@f#`KRPy_)e{ zfI`oYtHpc6Ff6oTO*$W5$4yyl3y+{zHS|K~HE4=`5O; zjKGB_WBc;-|I~*tebp}HH^zw2`3222kA#J07iX^21wLDZWaVEf8YASDe0j0I#)Mi2 zTI=Ev*OdT8#mO|(%4jpVxvzZ$x$h$fL^TB)Ssb3c5*(7Xwy&};b8Q!3=2v`s->DVx z&=@lqi`FW1U*t^{SZM%9D1hSVHm`Kl00A%v7nxx{1vn357du}ZQf0=qt#kH)rT1Q= z(x@)Uz4k+q9$1Jdf<$s5SvSfFsN^%XM0 zqBp7l>#yzP7*@uEyy6!31F6>fO2lnn9A9O=&;l<6qAbiHf^Lt2ILD*h;6kJP0q40TP4sr)S5Xf9k!ZNt?uMe)D$G87Ly5X{nuyCu+doEmp zQEIhYTmV>D*mc_95i<%hWEAw$7h31O>ud^wj4P+X28#iM5PZ$S#^5zqKS*FDbg&d7 z-ikA2B8&in41luYm1UJi7*ze$1y{q&U|Y;!m&_Y% zhXv!$AgYM!vZ7-Gjs$&n#&TQKh>{R_wt4O`*8l(kc9~YvmNd((wcfehS|-w3D^yV& zm6B2%M{%4etr3-TF3iHig&S_TVe8hdYu;BdHFfsjffvRn#!5+2D%VCvN6CBd zauy-)vn;dLS!ccTxy{K_(LNQ$Q4%MWQYlQ5!lyXrthI}ai%W}3x9r_}sil-l>m3CE zL^VG@KRY{%;!EXntJP{Yn`xSQ@0G0NV>Y)1Q4~c{L5CFl)=Dc-9F2^Olq=;tbBMTU z(m zNJKWb&O2cV0%L+et+H`SD{V{=1WC0rIyy?kOpqkWnm7HdVp^5u?(m_*A{@sN5iKq* zWxbv!CoCx7y)Sm2nS&q*!%(n~y|p&Rgu(DoZFqRZIwykVa@puh-sDS*ghjP#a&j`y z^B^#lN~Kb%6pA|#e^G>28bq~0gw;Nyg2ZMK>7^+Vv9Psvt%gtIWd8TC0LJ2gE{~3yM9@vMkF0FiX>sk&)q%kxRzLm$bQvsFbQyDsdbK zK~S{(8Dj)MKoqRB&ksKJK@%;O_dWr%)-rPx##e~4D|#lY)gfRp#*~s$94Gy@!@g%7 ztTz02i$8lUV!S)Zeyrks=CoKk#wlI^z08ulOF+mXMms&m6 z&H@Wz!Z4~0*R(QG5=BuQhT(Z#seMP*H-RFMD5VMv1(Aqg(Iy>);p<_EUWe)wl-~P+v|9d_!jk*iQ+W3^cXEBzR7xqWQLDZTgL?348(qAtSjGQ3=Zf7w z&w4MbUFIcU%SCeu4s2jwtq1wQK^Y1mS4bOUwATGicFwIWlW|G=Uo@Hw-sXAI_T?Nj zzhbwGP!GVXh+8?wYXATNcPt)At3YW3s6Z}F&Py=DIF850Mi&<5KKs{ywQ18PrN9`i zlopXRO_^B4XIa)uQ)U*X0@-`V-cz1u&gaZDHa2nX?mZjUZ!&QdMuGRjG5P~2m%rMV$W(MM3+R1HNBqvG*L`0sw_i5Vm(-r}JpJV_J#x)8y8tALqM}Zi z=V^g1(yW*Dy28RD2*!IMa*lkKW!^dfRUNKexBHq+TXv{0sl+AkeWTTU)2+KFCf4k| zWl$W=-}j3{fDl}QEgIb2A&a|9fCQGsCAbHIF76iG-Q9vaf#B{g!7V`GY_98n-}m#J zs`KVlojT78wu)k>x2NaVpYHyCcV=h0uR~Jme-sGr=_Jmyw0~1xgkW=DAg?gN!X(>yW3m~v+j_(Bm5yRG90zevDvI4<%dm_EQtx&>bn2k)(RKZk_K_M~)z_NAswpn5^>uAkpKUkF-?Ry{^jRUM zh3;t-YuI*pe{7ve&Pewje}7tzJ~x~%SFE8FtAc=q`}VajWsxclf4*;@KY){OFKxVr zOH)sCq(|;Rsc)D7C$%Zvm}ie zMFUV7fZ)$N_5HP)bO5-lfCYiQ_L187z~G=D)dSnY_NFE-sAov8{Z=V%rp%=1e>Dcd0?E%j)k$Pd~Pb8B1AgMhyszoJF}d52lJvyxJ&r_p0YnnJZ7Ddp!rP znWCe+bSy+qFi!r3TWy1a_bGr!ATl zLQd$k4^R2|eb>aaxZiSWbfZZS`{MVYKNijMn<`D=!q!dpC(}g^=R4pAs^VJV!X<#m z_yvW9nMYk$oy~A1tq5PC0q-9j#~T)ZT;psBK>GXpd)OStUSU<=X4Ej%LR|t&H3Q6~ z26;PRU#u^;NgYWgj+MydsGF#$JpPt+^*YhJKe=8lP-0PNJoC%_gZu0U(Q3oM^Sga> z!l2pR(cWWW@kFqDhTv)2t$QNgW58@ne7xL_8cClKu4Q@1yk`>F#r8zMbY`{DZf$;k zo_LLgQ<&5HEbtF#D_53YX>)jfo{;my-|_E8>B|H~;;@$vVdJcZKxX&TE?4Ij>Sh^! zQUZzwJ#~l70(E_hv&dGfWaubI=_Fl#C;(SIff{nagUx%B&_E>gR>9_ zRWY%m19j&;$Emyb^M7V=e*hkP8~PUb)v|4i!E%PexF11pO2oo~aWlo9%_8C7OLqZ` z>QTW7oNB@GV#To0na*fOU+UzKa7)0Rtuo@~bLB{2e~K#W3o}Dz8r7$Z;Su=xE!>nA z0bp#!T!j#%Y6V@+DbhnNhsho3Q?w?fnN2qu7A!=98Lktq_gF>eH(gB@> zr^0Bj;Ht;ddp0Q*AcMVr>uI;t8NQOAHHlY~*>nJAn3Je@a8<|`GJ2SV32yjUcEVWn z`E|2jU!@TQeoHB@g&=Z<%Mruk)1C^unP4Mfi2?WD1te9zgQN7-v(k`D?h>TfT42Zz zNP(m|ZwpfrmPbrl?g(2ORNx}#=~@6a?>_H^=z7KA`1Z@AGZ4I%hK0z$)Xl=6Qz|H| zqA}*HiV0!GKwubb{5s3l-9H&oQc%OdoWjC{)1J1O8R4?}!AO-)_Dw27SQ)!@frI`4c1(H4lRjhiYl|5L1BkKh_^&&Nvc0XB0Uo zbJPZNWPaj&#pwmGjRKf@(TlJmCci>^SyVSFcbpr*h)1s$CdXkrWDrMiya=76JqBOL z%@UUBjsV8Q)Hn(Om75N5VJHO6!$XS#ufiBk&Mvs8B1XT{t}Yh?<99H-PH)?h$+Z&f~t0w-bE<}#=UFDAb2p*#y84UZqF zhm_zRu|daKXmOIxOru)6P{hhgu=-Vqz1Ep!yw&2{O%0c#x)o_CT|Qhn94MS!)f^Qg zU3|XQ3`r~>{TmD&lhCqWahPMpoP0|A<&IQ43!_Oy^ev@z`Q?~P>q=cxzV2=t9&LVt z76ZByVZhf3Ir@BbG|o5>zF0YYet2XoC8ilHe)26n*>sTK+vaY5ihPU8 zB$r$jSLo7Fts&6GCU9U+4KmDh7mu!6R+vUE^nqNEi2|^OxnJi#8@iUIjo+*wmg=xM zP7O|W7{jtbXi@WzDQb+?UrL2D_(u2}cqEEY&4TXk>{Rz*>l2tmjEUsi=5boh_+Nq1+)YKGosV3bHqp9zLCrukc#JHP)x@Iq%6d~{3^)CN+ z%IPGT$@A5qffnZ@s7c3CAJ_@PC@3khFpYwBchk`P03lm^krC`LZ~)-C*Q$l=l5y z9wl7uEmm?K3g;>g7F8C_3HWz|%@VKmd{xk`!_DY6)a<0BrJ<&vM@-cIGXd>EsTJBt zGq#PWgqoo_4)r92{;044A&Ainp3(|%ki@1X#mW`$mAkvU#k~MX^4@QU_KJGrvtKT8 zlHF_!`ou77)gzbr`S}YA3p;)J%U~GHz=F-;O&m}-4=fBNguvux)$?>d4ihcMwqDQs z&MBn;0?|$6PF2iT_4Qb3KtY6_KE+Fziu;z$=^E-~WI%8FJeu8s!AAO8Pt@u__%WmCT>t0sS1@(%CF5eC9QU`7$(c#fb=`(t!; z`p7xe4CYh#4a==N_5cL~ViwR>9H=Ao;YcX#5}j6I%Bh@VKJ1DMjaAK#;$g&k4P%mVnGM4Hi!7)CZgchGZ>)ZLy5y=BD~PpV1F z%HBej7&nV)+)s%S0xGXlqoeFTZnxq6z&SOAhKA;z=yB>VwxpKQ9=6#@7y)3)iKkUw zjdM&yOecV~<{{SZMS;zdNrcX<;7NP2$_R$b7prz1J-!G}quC=2Xv@M@K2CQW%YtEp zc5^m5N^H|34ul@`wi0ry1TP#;PWt>X6aV?Q;u_y{b>;<6(`oEdid0Ckj1+;ZdT5>f zbOfY_u6iOV>p%((DCo#VrT7a17-nen1cZz zBPXz#or62T!WLxhYyx%!m^fJ2S~&uo%#EA?=0+}HfU~U$*ul)s77Q@51sGX_?9A<~ z0S;grI~OBsz-I?L5ZKWX;OGo82N*d5Z0&5B|C7f81TY4J9UP&%nE*_{|DEgsHUYR= z*n%BdLR6HbU!%T7g@J*2Eh__5g9gV0eP4kBy-gVg9N>aO0Qj=S=s^}z$Ws8UK?J>tZ5;4)ze4>!t z;9K>SVfWB*3Xs=j>urYP&FY^mDIsC7oI?SJ+T*^Es9HAU_GIaHS=j4g>ESq-5>9(= z#@YGL6tlB4T17?aQ3;lzf%cpxRa?vdo2}={#OAxCP!viIPD(f!O8kz4=Z8f*rd5a4 z%;aXbue0~vb02rHv9MI-(p`US-in@4A$|O~+@x0W+&@Ba;T2Q$In-^{ie*>LKNf;g z1;_zhWsZD1-rJ#*JuhRGKnI#&iBJ10A98E#*W@AkYI{Ty*gljBpLCJpW5I}vH32Ek zDakLhFwq@8+16tSXsjI8Y%gd)L6{mw#xa58NZ#(_1jAT}aEwI0-|A(K}*8k6?%BJZ8mX!@`_rB!{E`eRY$IKl92J z15lt&0Tny^fpgIWt6L!S;*R6q81&i#(@1jjyd@}nwqX8u_b+_>5vJAFZj}%etoC;x zC&Hi^OXrb9X6U(%P-eZ>ta*8QN=iy*rXAPY)dxzl zFF6a9>KA`7jik_r=FmmLgZu!PuvjdHwRLSm{QL{%Tz_>I{&r1NK%j+Iq}4}oc9AL= zgIvh%v%90@TL)J=2b2F!h6=nRbOXAx0~qA&-~hIDvUZ1RwJB7d|0&^bnGRr6umdzS zv%jeRjf4diRs6rb;2)j;w;BEhWAtx5{sMP0vatQT9~f#TwszJ`&@>wxJ6q@>tZeOE zp#?y5|LZ5v`2LF^w3Z-fEiD|Kpsw^c;(x;Vx2>Qk{udAWZ_9$VuRFjFn%Cj)5kA{N z9n0}=oBU%{|4Vq#*8MM^`fEUc+ZycfFPgtS#}4}bANKzc`LBlmPxtvx)Bo#bE?{fB z&o)q6|8y`uCN?%UfIHa8!4V2Z>Hp?{|LLIrX(UGrGg}K&DC7UdWnJx@txcfK=U@Zv zJ?{Sn?tjqySImE-{io0T4IW_Z?DS8cw=pt-wyK4bIl%g_5&uOEVBrRQ20MWM2KZlw zZR`$!j(pF5#y@-v415fHH+(64B76|M3;bV8eR;hQcp>or9f8pQhob#6wBS%+D8hJy zsx9B!*_v4Vl@&+vzbf$W`+qgn@$eOC`eco$P zsi$hTvKVBmc9P+qG}Q+fUnFV;LRfXsv?5V9q(!VW;&_toWDNdxNY5EnFaYMz z$n7Fz1_IYkN%c@0&PKV&f^0p{?ruWx-P14)oUNK-FQXbcx|1YtPqEJtdLFkr z0+7v1FvCL&#ANV})GN~?NOk{c!d&PqoJS6!F~{kCNSqsSrv>i1ezwJuDaYTYGgOn(f;+bLINy{ z_e#}hnpWcza?={W3d9_993Re;@d_mwLMOj5W;0#8VR9^&a~^^k|F(5aKQI>9kJ&io z)K!7*zTDh&pIvGxT&+wHOj&Z@l=x*9C6kXA^j$>jQSSgOndzSYX>F&dpa8g!mzH>v zaSkHQZ>NCJ9n?!xJ=B?GwndWtq$Ip5J@w=sE@fDTS5VxtVW5%5eT_)-y5NhH38aJnUaD*&WI^T2 z)|E!Ba~mLC*}%Gfq=!gff}%@t6N-6;> zBtH55egE=$A@D-rg}@7e7XmK?UI@Gpcp>mY;Dx{offoWV1YQWd5O^W*Lg0nK3xO8` zF9co)ybyRH@Iv5)zzcyF0xtw!2)qz@A@D-rg}@7e7XmK?UI@Gpcp>mY;Dx{offoWV z1YQWd5O^W*Lg4>g0_ICXZG|8NBxP!@82ny_x-mj#NCJ8Q9?^dP*D3+h`DOHj?gjL` z;LF?Ywfmhpeg8Fvu|Mh$e0FOrWGqZi#7q*wSSv;>XE%ALuo)a zDehJSJ0wk{=gK-HJN@Qjs_!ajibebK9$Xtv?!Hw@c*P;*%wfgey>EzE%UHb`oZ7$9 z82fd)nTn_ErKzGk(8TdhcWwPd`H?&0dEl9_OCLznyHhna3192H7yt70vO7ET$+mm2W#?xAtq5kBX0g*RTOFO9~V1A7iu8|x*X8x0;H5`SJ9WpL z`JJbk{2h{O>>Bs!z{b&A?cMo>c*{EF_6~XB#l3s-N7$u~-}F~*WExTlZ-!jyA-*zn z#)#Du+1~vq;i`~9gb(9N=xE+Ldg#AMj|MhG?`NXdCL0^S)|pRWYss7VkTkIk&+R%M znt!rN4Kw~7a2dlq`y89>6_&~PGDZX zaqj&bFyInRK#N|A&;#o|4q+u(^#e)A2wYDR9iI2& zwzS;!xUk{{6gtD^zSvCU(3Ii()bu)E4cGv$J+9+@Y^I&_lr3dTB;|FOzn3nQ(-hXq+5KZAQ{|W402#@s8=l=x7c?`7|L-PJA(f>UE z2OF*_+g3NK{A~7&SZc<)npo)eLvr?xAnDFaLYO>GG1z1aes}7XCJ%6z7ZO1oAy_06 zm}br`O^qgF{~`X6*}*7o{}EZ@dGr@ry{K0@+y#2jQk8e$5E?7HF2DGn{Uo|fPmG7F z*VF0mR0fjROXW?H3@KZ-5Kj7GcTXHmG9Tb9ZC)7}_e#96!rlG#rq=AuU|;go+AUzj z|3M~qW=Rm^`5CCQ7TVd{SR{FG_rtUC`7u@V^`lM4p4~Hp;nKYKonYh#36aw?Nhxm9 zm?&35QykPIRaJ#bUVxmSIZk%H_)ryMU4v~JEtgD4JjL&~hEr5n(_^amoS~_nLcc>k zN}h~kYDUm8-plV!48R~ziO@|mp3PGo4Pvb{?(*bX* z?@!FzU2PHaJoB-qyaHL`Y{T2_sOT`Z1>;Yav!)sz;;hH;;#W4HMfZh7)E8FCqyBi= zFT~`(jWQv%;-#FapxXxe20N7#Yfc~gRP8T&^6}%xU8BbM_f>SC#3v5&^2~U3J@;8A zkx%j+2Q2nk1DUHPNPaX4#CtB8ZVWkG9Kc@wAvQtgZF0Y6i1Il>)Bk?OjbEQjB^+`# zEuqS6Xqck+1mo|&#xyY(UbI;4 zRq^)C-qqwV?9E#byFDXme{>HVNizK821>FP$&aJ+U?g6)ANNjcfBrJ7oQ^i5Z0i|e zca;1l_4eBk)_2QCgJDxR6}SSN_$0e+^i}~}{X^6XbiuU&Q=*blx;@9kJa{(+5{gZf z^nS&0Q1~4CaPQY-&1I9&?+=5At?^Y)keHO)wa!mJJ9q*_?yKEw>aK%u{BE>xXBA$d z@;d1lc~7Cjqf$7V6A^S3!*y!n?W|%fVC%Z?2|V+>=;Y>U%wV6EoR0onZF3i|^N=Ms30L!IB=pIKs9{XY1YMJ93cX3ZMe5EuQeSs@s?5&ZZbbcQH*VZd|Pidft+|`Xc^y z9r?>s<>gq^lL8?ob{{pGJhfFS(>7 z5pMQpO(JRTSEM!C=hWmf@YFr}1p#F>VRGJv(RTOMy(*rDe>9?y)@+Pu}D=jmajU!#-yZfAH>< zfq+G(laX(TdU&LYfHhG*<}`S9v^%WlkbZjtpFeHK6ye(~N!uf~@}HS!OiezZYHrC} zUEHGK+@rVLj6dBa>*7E4BQCmA=7tco7PU}^BFK%b4@X-PGKqcbeD?)$^%+IzQuEI2 z8DW=by-4KT^?X2CRV!QETZEWhkdPzwIL?e{EKxsmKuDBGWtc@mn%X{m8qR{5bnC7& zQ1e8fcAENm$7WObe32-j(eCw|4%dAa-b{6pWA>Iu?42=9+sCkR`>l^cAzfKNr5l!l zsP7ac-(yjgd zPP2ejSeb$2zM=m^7y%qJqQonPLVN5o-f16S=QABG^h2lSez2U+J&2*?2edH$*lb)w*3#a%nFs1EG9X*81?3wW;ZJ8$QF>yRy|wQoaTJZy3MJ` z$mx@dV!RCw2(x>V+k3La*iZxFMPAT4PuI1&ERNB_N8`5hyKvtbl+#ww=#s`BsfVkg zp-{dnO#TOL*>fDx6nQQs;>}tejoHzx!uNFR>h?_?&>PUWU6T4Y^cAT!J*=_yUT~@gn zN#3JOJIxA4H-=xD+u!3qyn8h$F#iYZzQR!>(>u|_lc0IpUq-#dBjUcAz@BwQY^7c5 z@w=KdeAeq zvblwKXjnHF67qFC*+V!3-E)PP9Z#^Lolk@nFf%iWSh0ka2@)+M2v;V zDcjeX-#l_nD(yF|Gm>Yvz-tC$%TgltQv+p#=}vM4NCP;oN<$Y+0uD~98eJ3I1dt9= z)4rOQ35I_1E~PG!ts5>N{s=hxj)W^mWRmM5a{L1w^z$2;B7L>{S3GPxl|9wh(e^(IRPabXF0N-S z4FE|oY)@3i-f3K?q0Q{Me`%Azr8fvWc5A3XqCs@V(>PH>=&Jg`A#(R5Xv^QT za>DCGhZ?JB=2~(v`12hDFkC9PO^SuzCDSvl&WD8em8NpAq}!|g^;O@jjQG!eAjyys zc@i+y&sh|%pFR2z-PSvnP~y21<=eqpqMR}JIZyI+w9K-DdjkPN%JQN3E~ifI#Ko`Y z+%d&Jog=T1R!;q82kQ#QOp6jkW~kpaehU`8C-~i|{48WElAoqHIPef2%sYf}0~NTM z-)Tt|du6vwBgA2Z2lTWLO($@)aw-vsMVN3OlZ@CeBRX7iInTDzqq$C*a+TW2Imv75 z8h=b)Cl%c^Hn*LIOtMS_PC>_i6g`LH`Q#Rx+tl7k>#2!IX|iczem!Cub5*^x`PW;x zVnxnliJ*X39*Scufx7RchnN@-=1t7%wrI(URqkD@dyTRu%{apQ>T7KwBc^PrJ=T#U z2$Le=v!Y#J?7tQ3?C$dA#h(#n(j zd>6(f>YOn4MDnLnRSx4M&FXH-h+g;uQV4#>Y zw$n0f_WK>d(CUO-k` z1J1i%<4eO!#aS&ko%2l|PyCY1JNK=@*OoKicJ2uFFNkig1R=MLHmUoaj|7B;x#;-1N@_o8nMyV6~2@E2Wgw1 zNE{I5f@fNoR3FsUs1Dly2pt#`lw;sD;13fm&j%Z#rdoMI5xn9rC3eZl4cU*zU3*)@n4qPJM z{Q1}&VaDBUp`bzG{3e?~_k%z%7TWffLCrz*_H_K_Fb13}P;WRN64ME}Y`YtIMw=iN zR+|!Mc{^WTz4h%I_68VKuOH;VFH7hw)rU+TjSK^WW%zg9)kDi*bvqy8xN=5nKI444 zdb2#MP=Uh5mSJ->XFB8YIQ}-m)!)=d^2SCH+@<6>$lOn4Gba<*E$OH1B-6)uPKeo?bXJ zL(#>w<#v=6X-wTMHL*iiVmnDabisN`LP77LL zPrs2d!7Ak{DC9G_bMMS=5>>2vVFzRpm)E%5C|bAQ(?pi1QH(R+u6e@oE`ufIjA4hW zlevDyLC1fzNmyQo#OYWg&g(H_q&-XzB5hn?I$qvM&L(1x2^MK#7c5Ljs36^h651W*SgW}$^nEinC2f?MyYtl9bUko@depGM z>!x9B=9}vAHR=*e?DCL$0DmgSxM{aEt?7pTPyEh8Qt6)L94AI~ zQu43Vu<2!aC(D@om)+aOjmI&q6b*G~-4#`XLy%_qCx=R{aicc9LMOcs1$H)rpVedQ zFJ!^6KsEG^g2m1vdu!*uAX<(yvkx=8nY@&v3| z3dp~b4#-6N@1f_isaCxs#G_&Z2D)4kWA`*2^U)am& zoXbk|a69_S!tq;{@>;y@oAC;xIq6-ch?Avx#tag({eJ3IRqB`cKPOS3_Py=%;K7kJ zL!b1w@^h}|NgquPQbv;BWq?5=#u**GS0~)@`;;Z&5>fQz9++f4X-bptX|arr@K&Hp z41{1M6Joi(#V$`#H0|wpJOUPu`RpMTqdu4G9vy{3HhCOHDOA+5A}Ey91ky#)PvF#$ zEo@l@Mn1O%Cs7&WY~_oO(4k14%Mfj~zhmTdacO8e-Tr9mef@*N(ep04QD$<>4@Mp3 z%ftPt!|(ef_;Yu~j#gC49D=^^z4rmivI2}=zwfu&9t_CyGn8WF*xa7|fepZlN(wX3 z=9h4O&rt7rxb`1{2R3Qa*SzOB{&I=z_HO%bz9HJOEmlQE!4o6B z=cszOKTWZ~NXaH4O|@ee3$E2}7Zd_kt`wmnwLZU>npP;F6W}viGX`8IN8p97P{7eK z1nVAeyh+6k6qCYI?eHfD_gQ>bfhXAXtv5l#z@owRvaFiOgh0hKP4qVvY9YnMk}QMWTqPZ>Q01domCX*pO=yOi1K#aPz#P%RO_$xDx{LkX7@6s`V(#3&~S`nCHS}d1TB3*Qq>$8L>AY6t;v3Z+S_~$mC^^5uNQ9N3PfNkft54Z zscq4=S~n(1ZsSB7&XI=XF+*zBhN^3lJ*(XXk=x8WNsocCpQ7%GKX`>Z7jA{RtC7h8 zh6V^5Lzn!z?1e0HI`QZtPBE)%cb5uedSEw)um0!wtQXuT%47kHSmYnTH-|i`?~I9#0@K8v22UZLZA#SGSf`$p^l+Aum`ug$>oQs>7$&n>ZrG7yJg2f3?T^P{!1&a2Z+yM}es1MhR;|G$8e? z{u6P5ghGH%$zj9aCv^uzz~_D_j?@l1K3&aofIDrSAKn`J$pPMJzMR(m3a_T6+Dm;^ zJXlpBhID)1FWqJtG()?w=Qg``twgI`nFH?K$C7+^Xm4EAzcbz;GkFd%fi)9u$N-go zD>>V)-x~{F>lslN>bLd@_TL~gps0G#o&ZO~(~)9Tu7(`n@IBw$Ql7Wn%@-1${L0!y z3D}w++FJJBAkoyK%#&b<2o*rFz?37CB?v%k5dO{*BVZ}zF`&pU&m&PlZQd9FuZ;j# z>X59QVpx7ow7=sVuP5#L1sk*$;+hF>K=%3@Up%|ajP>gk=H>`d>l7=>C)PYNH;+%Fo-Yg>00zPrC7x-F6q{)|<<@M+-WBC&O~?`&jz za!sdK)9*N>^y+k}^9twC3N$*T=~VgtxkCLokERbg{$t6dow0!=F=bcP?vmc%H!HkF zT&M&?PEylH6P}m4@i9$(=vcot!9@K_jHI+`r7E;HzU=bmI3Oor8g1S=w?KM0^#Nr9 zWdz8h9b>Xff|W)NH--lV?_1oKoBx*bn(}>uHl&;?)L6k9qMd}bx>fqt2z_Q%W1D{gf^dKinjF>KFi(`=p5pp%(S$K$N?UG4^v!Bwm11lXaRF zw~8Rpgs9lianR}dFYZl?3Ph$S>7ZswLl)4OxD)xYgL46ted;Rg1H6$*i6zBaN$bK3 zsR)vDM$$OFvuqk=2FN(U!;Xs|-?4J8US+&Fdo&Y`AP9Pzgqtc)8hm4`w#P4NFZNAW zfHzazGvpexJac{1Q`Ao@w9@PFBj;j=#A4Vv2Ft2)bq$@y4oT05&kvP>H zj_yq#-+pzDZCt(9*Q$7oC5Z(Su0UT0r4s7B8y2>7X@x61d;*Co+NNu(Mr4AV1(&0y z;z!cMKi{;{d&DY5t_qNsH+vKae1hmsj5S7A?<|uQb-|-62-QtNv+N25)0Ejh*YuN8 zAm^qLOt{`|dW||o{(K5#3i?B$G5%O5F|d5u z5BrL4&!yhhZ+U!UsXiz0;jS!>JEh9CmkE_>W{wJJ0OJq{f{WHBfk`rI8quL1AQ9(+ zGqiB5ZFGH|#1t2VpCohrR#TPpshgAf58||cVb9O8(eAErkmxyC0jn*=B$=s2r}+(b zi6^VXPWJFFszU6f{A*`n>Ix=^ChE~y9U;N8S7wI8HJZMwb>SQ?EXJB8PR7B+1N zvXVDoV!!i2zGEEE#wSpf%1)D(LP{c-PvtF!ek6Ed5jpj3cmz;wXD!EuI)z9?q@`4L zc3!d#iX(d7Y1>u9rM>4n{ftu50&Ef}ddv|K_?2za1Wy7;kdXZv6C2nYklH0iBaDxy zK$sxL7ZS_eb4Teq>d@AVtQ=YXUFz3575RhReDei0>-Reg20`jj+%a-MF8!pE9}C?S z&^a?!D2=fqoBtIM#gejJ!2l}Su_VFN1!3>w9DNJqC4&n56+pw_su|q&#l9cH6B6NE zu{mYuvz)}M>-X}k=LNT3n1$S1L-9h%2A8n~Ce zr%$3y#(uKKZNYRL=FssUrxr`WX2d6HK;>e&d_uA?evm#j=-MAn&X-2XDM>F2CQTsz zlrE;T&sw2I!0-R%O)+&TaUnk;*(U)5g?P4=+U?)TjI2U^XOrsF5^A2(*y8awMI)hJ z96dm!Ju7R{<5+8U;5|v@mWo;eO)T5_+qJ6E4MP17Tx+h4_huT4gAk!XM2O{Qyou`C zw%-pdXMw-=vd&FJE%j}4n2NL5)nC(dys21yrMxBtX8%n+hA+d6HLE(8?U-GXx@Wm9 za~UVvV{8_p>mugr^Cn4=$nK-5HS?6U)CQI1hQtrCl}(gl@$GeY*y`VgCbxu#6|SAT zq@QnWo9;O_4{OEd{TQaabAOCC+Q8c#9g2i9M83^vRt%>3tQPdlfH=!vvZ%HcTEbFP zg6SyWN+?Vt7DAvn$Rs3J2=oZy(xr(+ig)fexuN_%Sgl5yA~uR9zkHOHHn1zsf2tAT zypDTU(>?BA&?!$OVMmhR7~dE0RP8u8ktRo^Q6@7>09kY3?OD6y*wQvMJrH)~cwANo zjtJMJ8|2KhdEa19^7lipbNHL?pt6jA%35p1OYlg*9Dxig$>vZ4u^m!mWG(kXK>qCb zYp`I;GGfput>F#k1z!xhaUsov2v6qxR`(NTM-mm`CzcF&`nQ6(p4*EpT3X8wiJn;{ z^!-Fhx6)oL9QucJ0v1umw&$8Zyo5|1eiN{-U^p9ajyRb1z?XD$5S`Ti{v#^+?jY6) zgq>e4krgQRO41lXiasxKv=%k0S0?H*E8eWpHF0Hwvieu_sc0z8`{8KoArnZ&TT=T$ zdx+GzUG~+hK~VBZ8t6G)nsgMaj55`NpT-d(Hq9HI-LIbqiTrK6>R?OG+ubuAxko&e zXSP0CEZU3kpehfktN;+lIbRCfYHMgI^T7B@&(o|X#!XO@z`#)eN2dB5_o|?+^+)mX zAOKpOl8VIC2ZNpUevIF4e&viByg3a0>y~XN>j4teL|+=<{V&}>(Q<$s!b7IxK-d~@ z8SS1MWx4%IlAB?!ccmC>m0ycS(r-n(3k}^P3oAO|&ESVflyYKghCCe@XO3Y%e1GfL zELC+Z9KSVAwz8#|YFDJPWa@F>&#Kb=P1PkX@<651E=SlJ7q9jxNu@&K)^hm*)y0Em z9tgFmBDU?oNU>quX0NwntH{IyM)ovidSq>UVuy&!2aVtDNfR+Eom;S_v1ZCo*Jyu8 z@KCBL>v-F9Yig?Q5IHAo9b%sXN^fQFY4ixP`PB-nI&-7h2sh{^IbPYj%Tn~l7OzZ9FL>5X-^B}pvQ%G)!JrPW2`ut zI;I;jr=YtJJ}?#vH{BTL3y_oF$jw%D-Arq!dxf$&dw96cI5x1eG$=&uWFOx{{uJa1 zfu8$w!v_X*jx&MSTf?tfdj^IwlCuKD2NBaqgDxx7sTs|+v5pWYpVCeG$TYdc&2>&z zN7PzEc*6F%C>C@is6ujBX5|G+=~L?Ia+6OK+0z4BiXa38{LW7#aYF&_JOi_M5-6sZ z^s}?uQ?JlO&$Rb5eSGN-v+BFd{iETi5Y^=JE_)ScMtI9vJ5GHv$QK`UH_gL8rI)k? z<#smXevC+2s@f3_mx-{f6X)hTQ0YR&DD7!HtpW)xUcV1<0nn;{tzjNNheOnyG?YVL=pJy{J;qxK>Pz# zGgZge8jsf9cM{O3g=Z1Iw@~UhU>R%}ox)pv97!BgE#2CVEv;Uf*G@<(3KDr>Qi7*L*0W-tM=Pcb zfigng{_v;7f~5rIzz?;rR`X~vZR#V!yPGR7-~AjCRACsTRB&R{6TGTd<=#F-CenU& zG*UWhXSfx(5a4u;P#rSA_9cb^i%nQe(rC5Nvj5NsE)23y*h^|s1G56&UL@lCf^p+| z#wr@AlK#1<;fsHJK*X2fjxTKUs_}RXuOv_q;Pwpm$#E$btZWoD6XSoU4ek3{^JEXc z8?7ahlN^*f1%UlxIpV#+;S=y}zB10L3|%dLC1hLGcZ;B3)K^U32$z_PFy0d%oF(*8 zO3>6;KXTFHfBb=kg6nsD59yntnP_%CoMeAkmM`T)Jw=U?F9MFalR_OYk65iRH2rs>WrGmo+ zxyT&ehD5f__tvp(+HGN=6r+gDkSKmXb}(R`x%z2GTP8zP>~st(4%>z!pe5*(7I)+$ zNLOYS>D5#|ZcM+-E7feeGD&A{O+zCj_8f)iY{_B~6{_dyBEQ zt%nc+Qp#Kzs)+cm20hdeRk&P}&k@%m*1t^d(#Op@`h#1Z1FRnrN-i;-Evj7zkWE;q zjU?F=QA(@ekG?rd1=drgm8-TZBC!gzJokhFYjI`6C8!{fef7UfY$edon(n&=7S#qF z%j79ZTvkMz^d&Q7!uge?sn1>ZSI~v`eLIOt@!CNpj7ap8iN|El^*ma>9SnB6J}^rr z(ML3PdRyWvcN_9R9PZe6j=VbFRhwBb>kYktY+e-GY6WLzMx_(}iH_}cp zj+t-ZgiB%ghxg|KO2GEfZiaoAB$hK*<%Nn^M0A(x1kh+rD*=EP_C^?CsPuTbZ5T~{ zV|m4!X%Kh2yZ}2sXmzney7?LL@S^&Y4}9_%DN4U|wY1N{o(%HZfceA630(-CW7sW! zcX07`!-2^~XPeGmi?{DieO#}sUwrKLHvOdZ$<9TbGRUAy_?;P3?}m;1inXXD=SRQ+ zz}ZjXM9et}vt>?UnH};7v*WP)UHQJj?&Ir9tW6n*9Xm&pv)~)t%GyN!WkkKb&$Gry z>uo9th|aodi8Puq>Kc9=J|VV~ef!jy@y7@fsDe)M;eMYh&(-j!HR9duV$`y=Kqb88 zUGk2hCEdSfi)_Og5taOYB2A*~N+#QB^T{P`6vtT6$G!WGUuIkp{uvE5m%Dw6{fPWo zyyAH+v&-pqo?l78QOBhP{#aUGOLfoZZOlhd(#xrg(9E$T1R&Y zKzhaA&z3Sebfo&zP&2WuEJm|`JEo(jzuhi>?N>B4mK-A`tE!rcfU>GUydTHGIq}Uq zx6>J)VJS1>jT_bLJ=H777FmYmp@)KI)PjWrOEBF?GO10hMH=Cy4En1ME7 zGSu9o!mtJGlcsKk1_{1gW^T2A+L@>Q?G|Nz?u5xq-19!_k!_AeSTcoWa|QjwfX46e zKjq9NHO593r1@%}loAq5ey7=Lu19>`K|_h-;Z>swpN-he^}1mtR_p=_@oO>KP=5?J<0GK z+2yis2#x8LloZg()%=e45P6sRW2lC`_BVtMI{p)N<=2hu>M~Fd_aT0tkgE#yhx1|fR?CU*dv%U z0i{U#T^82XL1=_A6j?@ImSpn+JI_eOh!6eHl+AOV|MT%*;&%>yg)iE_!E@WitB2&-^XPg^VPPwSp}JM2l3HWy>p}Y! z9Yg6Q>S7P)E8=(sA%~z0&d%w_$Emv#FF-{}h#0)4+gV1)n5vo*n}o8Qfw#E2psHp7 zZ2i^~M9C6WouP$62uVCRPJi_z%g4{M_0*#%Um=BJ=~xfh8GzFC2MJ>LC9GXyUP@|L zF&)i0`_^}I=FM;C=}-P9c`*)T5XIbo?_EeOP%13CN5djj(s=ze&749t^Vmc~V9hu< z6+t$IIDx3k;+yXRyT!Fnehsk+PyHY)FTzUa7XP`Xk=c6~oc<6-pTbpFu+=Es(E3)T z&?`{!3A~*UbuLg~K0$~Y|LT_!Z~rOu;_4fXux^pnYqo_# ze4RbK5VsAF@D67kbzR}AlDaIZs*=3O@wMRhKL6jcu$0kB;}CY61g&C})F_z*zaya# zGDQf3lyS32NrV@aXO~gG{yg=}Vhf8{>rzyCSea6VUg?v~=QtC>S}84VuE~oz{dhq4 z;(2!ex6fkEtl$nN*s5gzUp`57?Hci^b+RvQVW*br`jGV>eT3alewlcAk&WZ0d1>zj zc6L9{k6dsRMOYXQn@2D0!L$t9K;KNascWcgfwMQT-s8j^XRl-H5n4l0Pe5p_4@#WF zHK48`)**-Bdv9Sl+YRDK8Jsq4RieZ-JX4bBIOorQjIGbS$d#`=76!fhj8Z7OApZ*EF+Qx-HC8f zLYA(xwe%q_>A%SN=z#vl10?+iiTiIx$9GctW#)OpB+tp`HxLdc6&F}fxx2VIKT< zeL(-*Icn`XQUwSMjU&eh{RoiUy!J(Y;LvLnd38~X$-{ePb7IddtBy)|4Gy0ADf;6C zPeM@JLv!|n$Y4KNzJebfr6_w?8DMq(#wTeVI9Cw(hgceK(Q51=s2#_YK0?HZK%;_L zl5CN}taEhlLqx69Joj7wmO@t^_ZEkC7Abv%@8iuz$k4}RhPczhuho#Azzag8rzX-U zO`4_E`^$vgQ(OGt$27WtSX5nMmP0VEZuqo-^#lrAB1D4CUxM)yxbcfPeFf(o#0wun z_$Num7my}rRKOO{pA!hrfiuY9G)@dD(k05g2da*93abl*D3G#-u>(r8K=Z&XDhSY~ zqP-Yn3B0g^8-$0}8F@Ltlo@HVU0EmFl*Pv`VESEDSnb|rLI40D07*naRIjXRO^O#S zP@6f-{NXzo?rdQ40a7|B49WIY=&hnNN8ij7D?wgtG8j6FqTtBe-$%0+vvlza)+T5q zyXJN=zk439)<7wR@}o&Q$m`R}>%o!gHu^0l(~FcTFDq19@bgX;gAuAEY%39@nrz%0AV56I}c&R^t;Y5c=ifY_Z`KI6K3D@ApXH= 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 a0Z;%G00lq+PyiGF1wa8%02KKDB=A3YIJ*G= literal 0 HcmV?d00001 diff --git a/demo/r1/demo_reports/png/Beverage.png b/demo/r1/demo_reports/png/Beverage.png new file mode 100644 index 0000000000000000000000000000000000000000..b818319af40c0d06252a6f3bbcaafcaca8e76356 GIT binary patch literal 72283 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�U^5gC612#v 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 literal 0 HcmV?d00001 diff --git a/demo/r1/demo_reports/png/Condiments.png b/demo/r1/demo_reports/png/Condiments.png new file mode 100644 index 0000000000000000000000000000000000000000..c658b6e4f81614b4ef4d3427f06fe06c0fd61c98 GIT binary patch literal 52335 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׏ISztF!^xmA4ka*$IQ6&8UJV&zFx63jB+8T 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 literal 0 HcmV?d00001 diff --git a/demo/r1/demo_reports/png/Confections.png b/demo/r1/demo_reports/png/Confections.png new file mode 100644 index 0000000000000000000000000000000000000000..11ca99c6622013f92b09d6d348418233084be5a4 GIT binary patch literal 93774 zcmV*NKw`g%P);C-YXzhGkfSS=G!9Byxy|%!tTy*7?5mt+lpDDJ8Df)%v$y5s?4S z_lOZt7)HRl0H~BfE5-nxSQcA?d{rCYT>bN|0PAY~rmU0_DJ7)LMN%ArBc({jpYi*c0U+O& ztD{^Ar4eu>NRjUoJVFYh5QG>>F``JQ7*HaCZHcbM`+;HTXg4d`<($523D%*NrkTtz zWko%m(ag4}XS+mE)3y<*OSCSKLQ;x&o}L z_2sFEG9X=i20;d)T+IYxh=k}!F+v)DmLj<>5+F1QO^OjA@(G^{CyA7~a)~3OAcY1Y zNqB@1Bq<09l2YhGP()8^JM8L=c5w{Cp^OCAqy2_PEMYihd3uZwfi4P?P>8A`7A57@ zb?&_RUG{Iki79Ggkh!`Gf#5yb7(xhyLAy^U1|aBBq2C2@yIrXNL^)L+t7pQyPlxU35_+ zg(f+@qyo`rWsA{jKk^fBh~(Xrwg6BtU8c z5g|Q7ctlFbBq3^2gb*z*4fqg{D2XX*Oi`n>{xv=>#x%CEA%Bdmu8tx!t70x|MuksCQuOh~Da zQX_;w>k=t5Fi9yP2|`TyC92xy*8Q*Z-S7Vn z)9nLL1vW?mAVfgm@_Up7BIVbT2qZC9n@C8IY@2~vmsHIJr8O})yzN-ePjKCmc6G*P zaYnQ~0H$o1Ztr879m?qrv+aG#dJ0m3xB{;$!1@hu+k_CLnA;lfGa(&DQaZ#ydPQ6R z8lMy|fh@u}QA;s0Sc?!)mIX@5S3J{Lr3oo=r4=Iri7_SG6ey{=prZs5F;3_%TBcWA zmwZ)KjVGuOf|vv`NraY=EQXG-K4N|NDQ@`^+b#jY!JT^y!r)XvT@>`|6|U=0NMZZ!m#B0 z<>v(3Lz1|ln9lYwMZwUmnV-F6F+Zg!Dy(y~ZBN@-1~1s!zd;`q_0~1M_q)H(t$S}0 zkw~dY#LLPwb8Q#xX?|@9fk+U%Ln}eB9Zw&9%-P}R4C^y?Cz|ESQ#R+vxORmSf&IN* zQWBgmTa;-q)r9q?WAF*xOc2$S*S_&xZr%R|`?p?0%JTnqdU>_30PD+IKM_K1!-990 zpcMS8k-iWjw`k*dUkHI5r2vUn^vK15A7i=%Eh*(CpCl5fv1QBE4_IeeE|;W~`K@8- zNhvZoi;#k?tsVCE_E1veeL`LEGK>?qk(~G5A*Hwkt&7(1*8vOS*kSqh^+IHG6TMn8aYlAl@NsBSS`+Y^zmPF z{_+VsjU;qSDjkTn!ws7ZY9i7u7PP&k+1^9f6A+phaz(36LGM9T6GS=X&2N04+poP# zJ>AdG=L)#40PD*MP>~n{K6pZKIOm8V^H2FCmm>;gV3J=18Tm?2^u_ioj6BsvWpg1n zfLA<{NMMv6TSiZek@b4ba>f)5BGan5HB zEC!VN_2(8s7zLg375Pp;;RuUoxZ}_8ix)Iai4&5ggM&M-fzoW+HH9g0E+K)!Xb_RX zb_~Nn+qMuAuC@4nz?3zMt|JCV-!2*YmbUFd8H#!fA2o|r&un{_fA~lL3ES6h;=Mpf zO%f2IM~I7-8I%xcEg(5g4xjVn!6(>u!B!=yOk&t95h>8N8xo+30^7GF*P)a~nTDg2 zb5cx{Mo?%;*LOszk>vzwYF6u>-Gdu^`|tfe*Y3QHQ03L>@$YC|$r}DGRtAuOwH7-J zd93~gQKXdlq}E!G0!Nhz;EQX-SYb&ulECS*!6K%ZN$<MfITG*VZI=M~h3e{pA1j1~ z{+QLvPjF{X@S8c?Td$$&9g=L2^$e0nL`Sz7D5rZE(-70eD>mTf6vi+ND+n$R;gBfZ z;6sa4B_VcL=kSBYC#dTw(<*TK{1ZNS@6Y&q|KN`(>K#Z4=ORK1gc3*;AqIqo;Cqgq zJ>c_Ce?_;RGbuHGkf2KXp~r_nQB6@rL0Q$%t`T@50wpWz(5}~2qsyR75AOTqHx z=PaLof)&1Guhc;=inOKdwXbIk_5OAkU|kdM2dtOJ$flgR7%A5ocW7Sk;8&0 z0@Z96r7J>^7^$*U!8yE_BqT`+tap@B;D(+s^em5Fa{BTazFQ(hqAb6L2$EVB^tNTN zCAw)S>M4_ENeBZ{W!^1Di&jtxOMCbkAOHME{O&*8L!=5Y1n;SIVpt#Z{Lx?I+a;Qa zXtt?J&D!=1T}xdShy*dhYP}{25JuAnM{uB&rP~}LR3i9+esNB+1JYU;ER$`GYnS+< z0UxQ#$j(l|W^>AukABK*I-}aYMI@WJMalx;m?F;hqoY8ggg~mSk&{wh8NROo>)*V* zcQ|LUL!T#nF^w&g&Xv@t49{SdIi(Q7uPMNlQh4t#RpK#vPy$3I*`2rJ6cJ(wNNI51 zXRrw|H;`keV2mE0heyfW8fm5QF%TuReqdV7@az2drh8LFiVTYd4?q8m&wuqH$B!R# zc63CyS=09&&O59dNCGgLqz$renC$HGwb$R^-EV)7H{bmhlkFWs$gdBTUps(|o>B$Q z4nM)ppHqdNKtM_uhJmD^G#Vu1q*M`sh(I?D0gccTf{0L5?BBjayJ(O?GTFI75ETWQ zCfuZYg z{XmS7dUpqr676PzECpq$DUIgr^pMA&{S9w@Zx>x`lad_i0B|9WT%|yy?1#h+BQGg2 zMb^s6e@(!91z1=7)TIPr82U@ad6paGk$;S7)Fh6iwUXm)TxymsewWtz^6?kd+C{XA z)+*a(#)%suAtd<0Atf2?TtF#Bh`IH=7}YDK@FAjN!nr^YnutNjk{Ce*Pwy7Ic=Uk3 zdG9BjK77D%bVOXQi9^6U&)_XSd7K}JDH0`kA(4|Q=Y`?vgOB*-Pk+L#dvEdm-}(D| z^V`40?*0Kj27F9tCD1C8`ZL<2Pm%TeQ)o@U z*$~|T-lJk734tm!JJ+wXI6r6b7Cj7Bb36JBBxgT9R;r|z#5mcJ#H9qZpfe{DZ~1h zT6v<%r<)Y{^@-9Tq#~tUaoLbi6j_DtEyffCZ($_&qm=YM5>g-x9c{P4yAA==)r3lA z+tT9vl(uWxIgseWuw4rleTR3FqEPIsn)AcYSgd&InhJ@<}oU=%ysHy@j6P@h{ ze#j(!QzK*|k~n()i0!?*%yw^O5pT#AA|(`=K*&60NC_sG57YQ*^S5+2W z3PB7WV+>J%bC$YkSg%$nr6`JmVHl7y5u+T1p5VPjDarZyitA0CCzIY&6q&SjE-+Y| zRpITLH zwIm^kMqr1YAuS2*n&t5!&mMis;|Cw}d;jQ>t zloi%)IDGmk^>hZh!n-gEcGKu)NS6~tpCVc*1lb}bwL*;Mb{{-;y+mnEQIy$Yr4_&F zW^Da;6R0B2S-N&j^bRG}n06^fE-GDm=q@;<5CX=S3p##0umVDY*128#qI&&;wAWf^ zAPAXT8ixK782i4bu4}Z`SZgWEe3BGJk@=9SA_HV6@`k;2N=YERRoV7iT!zb9}z!@zZ0TJw4(0@SLFw1i&Yt zC~%d+MMnq$H+b}BO|Tt5TAs07t@)4t^Z$ZdxAs^rP6@%Y>3d40Y03#cN_-M%Q&LtF zOi|@&m=6f0P(q=?z!HiDWYF<_V`m4&!5wtopQ3Avp74!hk^6sQ~Y{hCN*11v%528|K=|D zZr|XI`*&F{RvaIm^8D#3A3k`-lk+vfIf4?{7zrsNQy|8HaDIXhmOuZqKPA|X|Lh-KN&c+(2Ujm7x^N3G?TlB1J^W#B|!AtD59{ zLP$iPc>d%8`#W1~O&g3%6m>%Y25+-&t?x+DA(g@?@W~@wqEgxD9el{zHYreA5o2I* zmQqL*5}6`GB&>5xDli6I+;DRE2q8*B)Hy{}X@rvakS$zAQ6fgCgH#Fx#1!)PBDauA zznUP1;IqSG2;<~g|6fuzt^n&R1XR}cIF~g(7p7rGT~vyKB(oCTk3@T}jxv8Bl_W7n zyd-}quJqm_NxAKd2{YPfhSAiV1LDNkD!LKqB;JSdfHHJli?wdNvPzm}k}Er@=)I?` z8%$9VW9G2dt0i?+aqZxM=pCUS`253?j;+ZQtff6Zr4EV0 zMTAnI1vjp3^Y$CJxO-!p*YE7|+O1vQeET*(`{;AtfB1rV*P=^-j~?qGYJ*OR&1yk! zBR~9K|AgDS1wZ)i9lVwdR+3~vPz}1Aq3bEKsPkknfshGA%2`}WgRYRK#`$9ifo`(| z49Xblx?zynD6XZ(MF~<;))n>bTcl_iyr&;}k_+gjp{%N0A=)0TB_i~=o8c%vWCI})QPl!!5U%$EvCmAz`(l=S_Wmt;&fB9EZwox23U zOs*@O%i61^o}jhC`+U$1gJWy9okQkC9(OCLIJkZTV>H)q-k{%XNZun-WM?+x@n@g# zlOO+>_2Ej=nNs?I=m)&D^nJ(U=X0JsdC697xOHQPgM%$@ z+`7*1eDCYLcJC(dfBcvaU%bRRkEu&^VF<}((6$4cw#Pe*R1%*gE-G{}!8E(ba*L!2 z0)~*XeMsUV39R$TszNA35(=#}(OdkmLI^`jHAzT<^DsU}kx6{-dK6h&QB)0HCZvh% zvWrj(>paOxyZ~^hu%b$9N)?c^2?2#4dI}9PcKEL6+Ww3}7dcLc#Co&Fr@-#c4k{Ih zAX&~WQY5NE(?!qe%R_Xbsb&qjEKpjqUaycv!S?w^jmtTyS zhruD$NWxzv7mS-LRAmM&H%{`z7t$0+3GqdK3_WXu~Z#5j5kBR=G`%OC(DaUr0! z87(-Pt*vcD3@8D<@A%1||0`ae9^u+0=kpW#RfkfBD503`asSP?*q&`6x`C%3f5Oqj zhmfW7WK zs;EH~BwZt`h-r3E#RPOklm;I%=oUs{ts|y@k}|9FMZ)NUrmS(HC;2W{AtaJ0P(qAa zxPh|VLJEOUSw=E=Pe`80tU(Nkq#}K9@hKw4gw@~&N(oH?QbcrNkZ8itp=DydoFkQ{ zFirLwj(}B_`2w<;AETrsB|!j6T_8jvdXG_xsw^qA$#y00X*U~8tdYuKstGAMq|B_S z7K)@4Lgm-B=cb_gW9TYF5mwzICu$5G4~ z^FNmWB3DeA)b5c2i~=ELR;X)3HBR)D9wS3icK>_ZW2%~>DsdqYM%|Y89w{Vp6bPo# z;v!>Ky~|vB5R(UTVr3MPs2Sx35t$+qnd3~7#AaUy)7tR#^G7`V)d%=ZOW!#{h@{b0 zQ*F(7{hQz6?eBh{8#iuJ3&C{vFKAb5TJMQI5?lnO5GfJ8W7AuH_27udPfvO4^;>-7 zojd%e-~R@``0xdP_3{{1Y6b~bB!U8A42}X-ZllXBs_h%3Vn!62ltw-Vk57V#hg_@T zy(0umqa}4S!w7J$$H#ye`NBNrFYwN1{ShFOBuYrdgdjCWN`edcFd&kE=ph9Zo?r)5 zJ)vl}5JiI$2I&KaK+_aBUx6w~s-UPEB9elHhy#xve#ZIHbMC+X7UgUYZ#~HllvPDD zo8&6jI-2cm>bfLEhmjG2CHMhDB1wf%fZ?hIE2E4Ou&87^t$Cv`G6fOi(6iB7VoO4LpjFp`tDuGgl;QOp> zPPx(&QQ)jY7m5%QYBVGJ!D4iQi;*NiX@z%|kN)Pb7}^b?w{+{Cwi_~crX^+5u)Vua zGuy!n4NB(9E5b0iv9m~dNHC7n!zhN_#Kg}(ea3^MGrslqZNByPeRj4Qe(~ffFTBM_ zLl6Q{NP?7<<+V%@i*nqILS5#037Lp#3>AzQn^s7W8V8tSij0C71PPBR^e6`zeV9Vy zQ?6oy4+N2@wr3RD;9ZWNk--zg=mJo%v6dL2sHdoEO1jV~MGwItlBcRmkPR_qdz24Z z9~W#-L1d>YVAx=$TPTrD>64uu{Lo?jKr@>VQe?eZVT`1%OT3VmA&d#=28#%RS}2sR zvDQJYFh!1R4iPr(hH|>Y`S}^k<%;QSizE_fXQz}^&Cbp?%jFy?71OH5JBO5#vZ^R6 zorTLXA1~JSlx0a8tFMG4M1e@zAy7y&R$Cq3*{tKz>MI3YUwOcaAz=Fro7Fj+)e`3% zRn<^UXC$dXXryUC=nO#e3xR48*LClaCr0* zU6#~UP4IEdO3wj!xxLBWxez15CzKKlfEn9KJvyb66a?pyA%M%jr)cWTfuxAh5S}7(hlH3I28Zo!HdRYa2$9ul$?3^4Z^l4L;*7o0qQPUt#BN;yn0 zltF(OARec1vd6{2X+2viEhXh8^^9T>U+WhNji zR3(wY5?zms5>2+Y1OZ9q0<|m*Z5QeL0D3|>-6LHn#zg>?a%OwqLkvihLksO@LvKCP zt!<1k6lDcYs3Ej zJ}E(2Rfv%{m1Ryj4L)zP7E-o!Ip=a_n$~Dl5O6pvaGHE>;E5~%3`|>L%U|^ zH)sjXEN>>@W8T85tV*=eh@>)?kS_Mu3qqx_SFHN^7k5`AUXBlC?9D-0~$UkwQ?>A#n(8h_FcKeOw!Oz6{D;5Ca&gR$|Kb@d;&U}8UkQC(G}r{y>{^yYj0CjzJ>K=`6dBqz zUVA3f8A4bP0V4uk@RXAYS_Vo9pR_T1inDx;`LvN$3X%0R=?w@gcIey^ZTSo;^QAN{JDI)pE({ z=?Qo5+{JrO*L8##==*_YGNEoJ2qCGe3aL~!aEF}HFO?jR4^X3e-VQz1EeXL>SIt)< zCE_axSTUz3^eydXlP6UoqN^Oo;zEF=*sNQ$E~&RlRFXuI^Pdu9^+ZHTfwvvW4`bv> z=B^?!hw1^F%?7QrrsZN6n&Xob4)zZq35+hrX=Az^Ig4>qQer*`wNe-&!?RC$@Y#n9 z)r`=sY5EPW>pAn1tvmOTN;92K*|~O|$@T%ds2JAgbi;;Cmj#9g`}+**70(_$#J3xS zb%>A^>mfuEo+Ks8IZj``fA2MXx1_G7V?43X zmYk3|LMb)Gbh%v?c=R}N3;~qV^u0wXMOjqz-G*+xrl~6S4zA-=K{vL2J_OE>PdGk& z%E8TRSUfQ~8YRZec0&{;_4XcSvPT><-ktCAKaLseBgdia1FH*YcYJ%=w|V2YC2_BOX~ z-M*X#mZr$h+ed`fV^mOXTZPn^GP^N`u0;T4)qLr7TVE-_^4>A@8#b#sL*I^Zw^>vd zM#jk{!E(7F1h~1ki%@yDlPJSD83Z34MoFA^cyGrXqP&gzrfVt75;1E z>`teA^yHM&AVC|pcDA_o`kUN%?QQOT{T+7pcL~ODI^Q5oiIkf2^J5n0b0i5LZQf}o z<#f^{a+;_cEHN#z1;|I@d`aqiytP?TE#w$|6N#hBUkEi;g@UT7Ik%DbA3x{yGV-1K zclgDpFZlH7A>VoDOUWn`0g zj0trayQ2usLU3paZnGqGEk$&s-Z4M+)ce;-LNeHaN=l4Kq`qfbl=PzDTC<=U%sE|k@B7#Q~S#~SD?Im1JL+`##K z#Uz?>IxA?JhUH?3lp1X^f7A_@Mks7*K=9la+uvstItnb*#G{pAvQ5aQpgAj4nu{Qdo@JK1roeB3Brjc0~+<>2#V~z_LPzz+fHP7_4(_ zZEX=_6g5U$rcZ3+x2nqo~3>U6O3qG?+1}kI zioA_jN{qr>k+Zi1Xd>M(;Qc@hS)wtiD}rtFmS5wApbws8JE#j5Ht+HiMK+r|J8*V# z%HHie+`N95r>*7i@N=rFV0-rfWQp@B$G9Ykmg7dR!Q-5znbee}VYQrdc6QA69?YgW zwLvO{GzJ?ZK7lGr`mQAmJq1~sVSU0BlB#Sdg`^uCZQD^!a}_V8K&u?5W39~&3RxnA zA$URGc1SZL- z17~Na+`4_6hmRhxv$M6QbY#@~n zD0dn2auLg7hn~J4{Zb~Awm#&v&ThTI4n1XAaD6tRP!h2|W!N(9E_d z>KcJyds1_LK4*S<%4}zsBqY^ji)T+Baddpd-8*-1&e1dtUDvT(uBhvJ6nPHW*cxNz zy=+8jL7@cahtK${_kO~sAH2`{#Y_Bh#UxmY={~mWY0p=bMlhY0xb=q3YJnXT%1EMg zC~0uL=jd$C;^>eMe(^JIz4bQV`oZ7lJKy_0`#ZaY5U?rYq@WLuZs>77jxBA9{;&QClgSk4EXt^H5}A`I@}{qlh*)n~FV0aCs?tzuNw+%V z+2hYi-f{iy|YcxOmHHP^R+3_N-*8t;r9J|l=TGXCA|$C+_;B#p2gx6)jO&x zjyz|i3<^RXbhLKB22V9AH@r5LB8RZm7o;*wI)omC9b#;0R8j zM9M%d43o)(d-v|5wV`iY_I7u* zQAgl|8#g>5XRpcpKhnyeq-Gd;x|FD!$(Ite^p^poQjB;v;Ov04nT)--ZPZ-?g1V|N zV_KpRBv~M2q9iaW1ntpto`3X|`QcNRXUEuX&CqptA8<(^Oo22Nv%PCvzjKdUZ@$Cc z%{!d0TF!dMbaxM-6#IMoJoxMro*R>bJ(+n!?95b(I;_#gaE~?{o9c4NjlWdF}3XCX&khf;_AYf( zK~dmG`;xPf!c35=MjFXv{~D+BGrEuv9zK75!p_!&y&HF_CKKkTXY~CBVHB&?n(giD z*e;TWoXAns6|yV{NiyBuAp-SuM!axG#Dup4XhSjE%eh|u9H}KmIU}h8Zz|9Qy0GXt zp{PqtT@yt_i_y9j0tkWD1;N95>FBzF$!v$cy?umKEY_=Wx1f$q+u>aP` zl5x!LRw%7<2NMOsC$!OMZD=Skh6_Ufd zj=1P4>Iq@B=1>0FKjX%iu1EGmWw%`KYq;CY(kL)(dE{w zoKA^Spp!sJku&jifr|;BJRwB7uFLu@tw~8_f2b0usv;ysR0dt7Xy2{H!-T<)#Q%;%&rz%TghbhrR4M%B9322<5E2M64L z>+8Jxjc@YS*WY0}of1=G;wNnH>~L^!!0Fi;+GyVW#yfecy>3~pR}80TC~dfQ?HWo; ztR1ppTjmL3*1|=MHWa3yYc~{SnI#@yqNV=$kN^0O|F$N5UAw05);K%hy~jC^wJs+j zxPdrE0%sr-<91jPB|+gh`|Pjz;D7(0dHB;G!u%P9ouk7VBOHZ}MBn4O4axWD7!b~p ztfe4pn%dQhmrtMa_`OsbmFR2*Ep$#lAfcRnX?5|KuO zcYOGlKj)`E`ad{%^eO%65ySB@Y&t?aAZ#SIj<@d|&{T$xADv=d;@x|@h#2|B!&8=0 zA!apHH9=}z3b+_>(dQ2zP%3*I|4;JX%d;z1H{rzN3>Pj!#aQZOo|an!Trcgb=c&C&heykeSrw`XJTk z@%HrBipEL*%8JgmtXFev*D)GTs0L$N=Lo?;ibUsG)oZK| zxRkIyOHuL)MgW=+vTaLe6oFn+av!_oPR0Fh}e4fWrCR~6{mhOVvg&JsePZQDGU>~SuNgpqmfB9#IqvpYUG zN-Yqs<^8|L4xLmOADmJ8;m zhdh1w8PPXfyZd#Pb;oQvV>TLN(74Vso(%CeQJ6gch(_Ro<%4(L;wL}&bLNj9u-<=4 zTr7~SMWfNf4e*J!O>|x%WR=abt)*!LLnE^%i6#h`jCG zJKSUWqcv4k;X)#YtglWYl0+gUj}#!1=xr-mWge9PnXdxMXN|KEWYUC?nXVZjDDVP= zi23?01Smlif+vS3T;ATH5G8F$42(g_#O8F2(h6ripMCNfPai*KvN_|%jceSvdI=*F z5LqowaO)-G!Hn2M+T{wP3apPbQPD(+7n;KKUPU251YEu1=*j08nb^K?iKerx7IT)1 zIjR^?m>K0@O4F_wj;CyBSe+hne7H|YaPi7jMuQDV9{ehE$@)b^3?5JDsjn(C>|Ks; z3n}8F#0Q1?w#=P;WNgAg0yLYHCHdSTsbdL zVuK`x-2Ys$UVwL!?d@%58zZK(F|)~pve5b3Y}c$;D-I589zU!3^queVlQ+M^>%a1= z{KNm^pK$HgT>=UlBS)vFtWOqfOg7k{{1Xi-aBmD&^BwV&B3ExA3&N?Zxa!rN5pDk0MUn)$`}}x66%_F z-~6}S`{|D;no~@4_%2WkG+LMVkkK(+n`r`NIY1(CF+X@dHV6`Bp;@@2Ze??{(rBHpTn|6H&$~bR5zA+LEcW)8A0AP~ z#B4aGDo4m-Kv4})ql#K4Fd9(^d>80KWKd=lNg(yFLq6@YDLUj$UWoYUvTI)|tg|2# z2m1&8HnX35WZv7)Wg5`u_{cLCPF`_~-tiCU1S)@4i6Y_72KFK&eFc!DMyec0sw6}o zaMrT5F~NJwpfD6hGAI-><@I?r8Za0RvCd_|t2U%EQ(0R)!PhJg*EnktM391FFhf;i z6pHEA27x?`?&>9-i^SkaF$*i}x`tjUUh0gp7Qr$sO};t?i&UCwI6{gn`2FKGLjeWJ)M4aVfHH z6MIjO`1r$5m`)5Y+`Ptgx>ebq~h9* z8x&=U_mQ@3Sk*Pd$&9KR&@>HNsy@Xj&s>xg2q`!`IH0U5s%r4}t6({6vE7=kZD^V% z!_i`Vo-~uYuWX8qG4>mik|ZP&7?ujRJmiC){5$Ty^<%{9lwg;5nV4)&84L!*6j4!O z$_nQbF4Uyd5AX>zwx)Ak_LK=jRT$d-L5N*L=RJqP^W8uE=XC28zxKPoM=%xTWX|DFXbY};@oHIE2gkU1F zGQ>{Pq{xQOYvvI8Vv$7l+lh=ikG_WqCIK-bB$V1@fua&w@oX(!&KX51iBSTDgm{*` zlb$axLP*bp4m1fR@}CXP6J&2LR)9=d4+4^5hU}8=PGufRp*0svIzx%{VwZVNy!WV9dBEXxo;U zB!yHg4)LC=aPqTKx^K5UQ<)UCv zO2*Y7YuQ}P1M(z@-V?!s6|IySfQX7sJYd-kk zGoC$u%Ju6b-gx687cWI3ON3Tb)eh6?B_@+Cnr6vjwZQuYuCut%QI!?J3y$ZhiU)|<~mu_(V#>+h2YkBu4|B9|z@*BVN`&7kw>b9flS_Y#L=O^cx zpPq7hGG}9R17|z-_79lOYA#;71Tn$$kX(AcTVymEv0g5C^xy$EZrw!d;_pYnvRzBt zWJ7Y-i z5MvCJ*@TVF8Ad6ZdW}qykKTHl&p&t%dwR@b?->=aG20}1s0I@*Uc1T5zx;~~wzt?A z6wKfJV@^JL3so7kAJT-75tInL4+N3Pl~QVa%6hAmaQi1KHb#!uYg~xP z;gHRXm$-K83gu*g8jcxFChYEPvAMa)bYp`QBHen)^5h_gpw1>FF<`Pipd4*5oXxm) z0gN;hrDl0}$a`=96=hLz{mK^s4N4K>cDdD{|V zhcXIh9YtZde0irglULOB7~57ke;{=<&5HTzDb;Aq%{#js9)8FN@9l8&g|A?Oz?1`= z3p{=Lj2I&qFJ8z8#qqP8$GAA*q|j_`?clv7CGi|unNp%C43{ol;_;)0Jbdsu=Pz7- z4w(GUvS8(;mo{$!ZTq~lIxAFX-PPHzDJjZwi1mR;4sR$_Vu0n@y?6QauYN!{*~bVF zF;bO=!Jz8N1{#+H$$#nZtXq^WFjC<{hn5;y8d7w$ZI(M^s2)V?NHXEOh7=sh2fp`z z{|hJweDk+|m$a;z&rjIi+(d{(y9Re=c{R(66Iuy z91O8BBD8|CWaS*Ds*qX{Y_`V`B8k)wP-VV`^*pQ;@)c1@gE9GQF610QEi}OeqK~)` zNh(v5v=UhrB>PZTauF0V3(pf-fo_BbB}gjet(nZJL0*|m!R-H>4<6fg7%AD@-R0Gn zUSKkvP);`(%_fXCciGsOasJ#EWvLmBMntxuJL`!l$k1ax?ZL=Ew*|P&a z`}9)|_fJ`zw0z}jmwDrjixib$Fr2cxbB^I~iqs`ZmaOWAuAM_#(AK9kb*7BiuFd)= zo!^6|?eH;S9Xxtq`SAS})(v>^#TR+yD>u1t=>`~2-L)VC44MC zIs6+fSl)HmX4P99-1Dryvz)%vL-3x*vAan0{Z>XsMnlN}Oa0_CzIf}0EFXVC(dX2u z!cbNw(-4p(sRHPow(D|4mXau7z06lM@42BsVm+7_82v*CcMG_0IuetLu~$85|t5YZ7u!1^3~I-5;%Py^7lExI&lWwM`B z$Q(sx#%Mi6Mvy5WlS3$l^MM#$4i51SYaNL!{B*S?wkp22ffw?qf1O#P*x=|B$}qCDyyHvEmHsl!)i#^w#-kDnQd%S zl;wY31LqTH})-g@_Cw za{qmD001BWNkl z9ap_TH6VIi&%xm#!3WM=xj`{GhZiP?s(J^Z!>*Tjm!r#;bxUj`CM6d01+%RkL=04g zA`UBpGDrzc-C?9+IGIp)9V$hFvl)0-WXp+9kq8vZP*$31yal2}^^$}XI$S3aM$xY4 zq>$s;yln}=(zPwYI-+aoti`u2O=oc~ux?tG%ZA`1AxI|EF)!V{KuVSyH|}!#g_n5n z;4?nI|A6H>FdXf$y|cq$JZ4-v-0Fz7Sx{<)5EdZOYn%5DK6B+KQJdylu1P<4Y0lUskYxxmW>IWtlliF))4L|_tVc>If53wa8M`4RAHDhS z`0@9@$G89BzapUM>W0H-&+xWErieo1hej8ax?osV7-?vZkNEuEcQ{-w`23SkxH@te zc?V*owH6yp_6GK{1Yz>2hRh0eDYNgocW76yUgpa68yqhe zJb3Vk!=rt=rp7fjq3ci~QkXoC60y&~lLDs%p^w!PN)gDmjka^hLb0*E$+`0vxOMwB zH*Vf!_rf{0ch51NOem|8@pMW#7$VG&C=8|a*yV!Y9fi(er8XsGIYbXj%=8>`w1Y$E zSa#o`$vP@A7*bY(x}MXvF0-sitk>&|kM^!-a4Aet5UT-F2y``KTuty@gR{pt+fizT z6a`5Y^b8IJl0i{X4yO4EoC3~v`I@c_0ZF@FP}dE%?Q#c7MBwv($)RLIia_)h5d%g_ zyigQUGaXeN9G`IatKVYx!X19_-Jfzg-=nBXv>LIwb)9QB?lPWD(8h82_+#cr_fguR z#0uA*;=39tBUKqeK+`%>?6>F6Vw;vhS@GMyaUF@`-Y0X~Mc~7qJ>~RZ&2RsngT*%lQO!W7V_>tuhK?~8SR4epW4LS>@lbhbqzaddD% z=WNg7&T@m!SwhM|1>Og=6oeEprQycz4PJZWb+$G)Q7Q50(@*)?kAB47qer+9sGBBl zg2;iXUC41>LI?`27*8i$*xh0G;svhXy20&Rx7pdD)g;zjTs-erZpbCwW2A!d0+{|cgrlrnn)m!~yfd*ho-wyyI}|Cc}J{wE(Z zn+`a4{vuazp6BY7S9tN2Zy?J8Yge2co?^out9nkM6IvJ|vZsi6iqasYp=oV~D;64G z!?V37T)cdf-~6o`B<^wVlNMzLoSp{0|K~r&ipYzvyo~K&Fg(Y6*^mw-)u?29dxPO*mXi7|t5*l1WbP^o>DfPc%DB+X#v^Xsx{U~) zkKTR6-oG{cPvbPnaR zh%$6pRUcv?Nr4s;t>EU3tAw!P-upk{SFT-Wxm?q>mZol4?;p^t)~E={M{MW_t;Kde zo0EGE*I6(?l7iu&z{kL{wsbC_dJIbp5S5@ZC0je^`0DFl=i;SHd~)w&e(?Q2r(P|x z05n2t14$~3(MTB>4~LY-P$@-se9YsgPk9_XcAe9T2fkyb1a*igqtP;N(Qdx@5--30 zb+#^Cpcsr9kEV>LQ%18X#h^qPjVer*EA)qhF$HIRhm;axLW+nWAd_h~^Aids>8wW&CE!s- zNka6D^DJSAz;HZ4NP#v5QRV?QJ@(oM&uB8iC5220T?CXKAw`AOC7mkR#4sqvtQW`3 zPml1?)A<_j0&VB$Y{Z3xR3$}OG8z`Fmn+Usc6s&1SNS)8_yaz8>mIZ54BUv*Ly5Hq z=<*%Bthjjn8sl++caFB{ST5ESx??;@R7C|uy3UchF3*{Cfs+Ym6S^8PnQpRJEEtXi zufM*-e6h#F$8$_IWVP=2=)F%Vi;7Z@XljqpV=iC2!Pf33&RX`L?d9-QC2&3=b%E_# z1X;M8iK&_x$(k%uhCyy_a5_Kcy?5W{?%h{N!y)sNBR00S`P)dH{%b2(F-C0L(sgwY z%FEUSMCSj*K0_;~lhC7C&SVUtM_%L|d$V5BtmbTQ%@1{`ACAz9mx&UQR)eu<@Xq{uRT0)Z8q_7^!a)2rdW&_QrP&7{; zvq%o*Iz-oi?a;QRkTBMY?XjSZ1+Fg;U5Fe%{Ft9LbFRGf6~6L|zs3u%evQd=qkn%Q zNd(#$kj7*>sSBu-7ag+SYRZ(5D&b>9B~M5e8$3cMA{L1zN{JfGP(stJ8_G(eWkSib zO{dBjV+qn!q>zwG)2-*|fgv^xNhG8(oSfE-^_1Ccn8O!RB&C2U4C_^gi;-e5!aAFc z$SU*Ak%}NA%eKLjuc##oXS*yuOQ5AfM1e?};3bt95X6`uM!Y znai5#R5Bhaq#WX!nq)mj>nzO>DT`LCF^jpSp=CBzym)8K@zEZwZ}E1_`WQZY{{dT@ zGj=a2X0r{tZp|0>b5eJy3ksE3+a;wLVi?n$wk#^mXqxfQF&MPU+B- zYQ=}|y~~|DFEQKPVIdXc>FjU(dZ_>Uu7Z}XT|Xb5$LDAf)n}#U&P9J|Zk0ENxiCus zg3LT$`Hn!MoNiDU#c-=*Cnm<#fM*Y%5^bXEIy!67oj^+H3Y`n05Om(MTrcx=FVz@r zvQ8-qe2O^h7+6nZGkQfD1JZ(2nMKqK0D^bOVt_0Z)u^Pa7aZ?Brt4}t+p$ITYu4*|CWcOCq?k9DRXHF<1+F2A79SnOaLicb zxr-V}hSP0CQQ%WRc!%^c8_1Kulodr)kk00ODYN8#KYnm7uwK_p%8lnp7h?=kBy`{X z7iEP|8kPlJfRWb7p&^|rf?6X?AhjOv0ussTYQfI=Z9wwzhxZr_283`He44NPZQBx# zkLfy#keW~4IRSUVx!sblzIKhWC^StPd>iK z;qeKtyn2_fy#7@_fAol$N?v{KSGjcgMG!^qCW{fLr$-Ei71Bk1^443t{PHX8?gr}h zip}j^%BuRiU9g<9H0xy_-xLTTP!v7UpeI_MAzJcaS@brXK1WTYpA!U9z;-P@3A`+* zQ8a46&9+HbM}R$;Ji=Mduuibwu*%>x09$9@o|!pPsPl?z8MH(m}L=AT*YU zNuFy%$u}-m+}NIQWoy92*^p97Vq4>u&6jv$5hWyrGJQT?B$&vCDiEgPN)RkN&*?bu zXj${@-M`>}|KP`b`oWL*t>6D|xOL|>qR4brApxVJQ&gEdPc2HkFd1PZHS4ZH zk!hbrr81;ZNp#F9$Y=AF;2c_Kly<#ZFrMualOTkCn<*r^D6;|B7+gwt6kaNXE%7Qb zmI_lXsaI=~XhAqsg05b%v9ZY)4<6FCZI1OqB2@0$eV2(Iwrg>1M-q~@wj?KcfBzYa z<(fM$U7%?Ug-HbGSgjj&HY97_n-3OOLw?(LG$jL|B^R<@?(4~ zc<0AI;MR-Zr7nuGAZ=ucAMC1ihjNoltSd(w*G^3_O%>u>Zt}5o98Yd1`{FzHQ7RnoOb-u z8*iYDVm6*|;qp~%@N~ALX&TO*JI81|&IHoVF<-2>a`&s;`}h++|L7y;r*l%0=n!a{ zhH_owNVF~xg(4{pDib3^aJ+EqIxpS5gD4adfiaQ2Ctq;dNS;3Vf>l%Ftw;EXj=gqD zC}K((RiYqBmDTJbVMAioS~e#YT4zbay0b(fGCkB;tcy8_ASGHN4&Rd&@-jfh$k#56 z`R~7Vm%B3qsim>m+vfsA>+xPa`7i&w|ADXn`fn42LZVPff(+TI7zKR-J$?Q~HW3Glkv;D~Y7hqR ze0ChD%oDf4gAh3%FAAb}h?FoznMnr;LXrqoAXGsFy6DjuR53sbol|zaqZ*FztwSn< zE>u5~NC;&R!9R~Q6J!a95_#;<)+<7i&qdBcWRRgW1|QIcWVlr7Z%IY6@?j4yZk&@>+o@jkP;mfNJ&@MgqScUGp%AQ`Rv}3`8=?F zzT)oP^TfE~(@#HUJ}sAF+tM>P8Ti5r;h!@H8w6udO$TCVmoNsnz9`7 zy~xNzk?IKO9nu=N*=id9WvmI3F?9fa%V;{NOu> zDl0;05Q8D-Zr#C!z`zuozjm7_C2iO6^yw4I%?*m-fX;TDt`FE-t+;jT4tFPcyYb^JaLET0fAiC zk}N_Eo;D?1%5yM;BoK)yQoF!zF~(?x?HpaC@9ZKj27C+z?+H;6Q#K^$6di#~fr&`m z-5PRxY6$Iuc?`^5!E&8g9WOZ9Kc-$awAR!5{JjD}pK_H)HA-TPVpLYl#ud9;726v_ z2E&4Lm1Z*}F6~VDbnia@*Z=fCa=Jd{+kfz1lVX-WL~=f&R0^GPa&}BPVL1ff$Fqli zxG8dCaY|?*=-QejHOfp#D6}p~9)kCzSOns4YG2nwIL{H~J?#fh7&5j{pZHt!K z(v$_aikL#L@;90FmFE*^rBOWsrm5E)A03c{&XMp^A(hT_5JYC4nG!8D1D%%+)4@j8 z_KjAAEsyO2UDFZliqxI(__L2`niix+s+{1RNLkC2A~uHSrgP^UHA|8ZRD%hHta$wB zh{sR%aIWL#?Oo1ax=z=vczWD29u(*ldK+5J!O@z-2Wt@GEhHjsoS357thwS5VNV0n7V{OB0(EW`06 zcg_DP3s&%+uBkH|?<}aYPiD_y+8K)?qlY9-_pg7%QtUeijp7y=qEgV zyoXc;^OF<2l-Sg7>9Wh1vv4n=1k3fBYCK_F4bd{<*B+$=yPKPwJl&(v1|hR)x#`nq z0tqX?ONrDb<63$H^V&L+fWl~OuO$lzJUMVQc#rp)0vY=&WRM_LVh|H|&u#Ga7w@o2 zCHrf^7xRuMC#SScMA=AK1#~QtszAs-ctJ=|5fLLqNG{P>$6{^y{AfXV2!o+vXJg3K z-AyiT4wxFvE4vk+oF4G~fA&AKIUDiDZ~P-1>3J+r61~kQW<|DA2^T%Vwg{tov`y-{ z?V`6d&2dSwu{}WwgODZbc9rclT4HTOh%G|)Lw*9PP?UN|5eGP*6QE@hxZs%|A2A*c zsj5*%W|Oz5Qk;F}`hRQBR1-*q$UL@_<0Hgbe7iQ!iF^T(1c#bb5^i?Oqju#&Us>Nu->9g$e~M@Y-wVS*_+&#e{GC!b=<+@A2WsZ*%w6JDl6CINbk?4?lRD)5RR6%lukKK?o~| z0wXo1C|ED&93MUA^ZW1c&2RlKmv6jEWI#+hhqlTry%}w6;C&0xvs#>@v|%tD{YMwB z|Df*<;f!h3J}**dSG%8gP}yd32D+EMfHcOey#DvDk4pB#$@~!XSxosuOxC?9De)oF zMTwqlf%mMf!v@cw$am-%Eg{&IsA_->nNAr($g1{4rX>iCj*%*Qe&N(FQQOVrOT@U?bueYeHQkL+G;-1489O8nU#ge0H#AYgTaU z>L!=BN^WeIj8<#z{plZa>B<$h@4Se&ky2}t6xfim{6l8ih7g$u5nLbZg~-KM3Y@dg zuU=;zxJnW!3y={ZWzLHvQw62SK0ep0{LhsAG6@KgQfelHK_<}>NJ-?-5y;o*J`5uG zJYN(d&&6WQGfeN6NNtc(XJn8m(8lEMO63Pso1#BpLCcb2G{%SwHZ;S0D=4Mq_{o~n zy3O*^kov+D@_|j}nWZHAu1gS+ebQ3K*5qQQ2;Sfb)@bh)EOm~IXjs0GQleC5?`UcP&YYu7eeo<3x6Z=Z`7Zz7fCXFq#8 zi;b^cCI-i|$4^+!*Hq;QmooD`_>iHRtwTglReA=(qK)I(qCC!+y8_YUil?b zs8G7>M?gHcI2F3W+K$Eil+|L+csgVBACb(X|Nj>&k8SGb#VVyQ7c22x2>JYUi@Ckd z!%zOb0(WN7i81vWt&mfK$&funFOv*8EHes4ltor3$3)lE*(6F95sKt<>=qdr;~Y#T zBhFtuN7p#kt2Jd=usIvE*BoUT1`^+IGNnk!6iFeV%Zl;V4zqI?m@npiH<4YTNlJDu zoag49TfF<@cZn%7R4Q)?69k$4cS&YuR?L0}q)r6)uzA(#e;`6j}N|JbE{%=0!AickaTUJX(QHxcLD{>CU9{lar@So z7hk@_?)eeJkz`%Z**`qNloPggF7nxDk2yMAvvd9;qtTdlwczv54mdgN5L#oS!>2%q z9#Hs@vi{6DY)l9hC<#1yyySa-mW|XGFTaXVW0KGaBT2#|Rf)BkP&=J%a&)-Q;r=sX z49qsR{^ko-j4>ChW}OpI($9zH|8GjyGgUh>xA7_EsHYGkTAsD*kYYyDN)eIClGFXN z%psd~vsEMtjWSjLz)1#0)>Ng`TYpeA%Z{dAGZ@bhLSRE+INd;-7D7ZRa9xx2EZ$|h zq{z5nDbn+=?`&$q@v@t}lvtis+La^Or+X(5=n*aXXU_9C5Tc;99zoV*#hy!s2oNm6=fgg;xEwAz0+J{Vt7Xga zVo9lCV{Dj?HChT{lmwp$4yrP8>&BR0`sQtJ-#kYuB0*YC7E5d=Kux)P^*YsX$|v{U z!+XW0^Ea4Hclm68&a^6mnA$Nz4}=)&<7XKsB23^zl9Z;@|vB ze(QH8?3}yP6K{3@Tt>7q#E=&ZJG`q$}is9?nydkR9%x|4kr_u22A z*>1i(SpRY%ODSLf(7K1D{K;8Ntuc8o2_i~9u z=R95OkP^yrl)qO=TnN|@dn`-t*sAf6n|E$<|I-IFM@x7Em-(j^{^4|R?r12CR1S$%uszizry4>KkU-(sS zzW4$zdQSHbu-^0R;Uk*)35A40%e*ZV5v>Is;G-b+*C;{k=>=c{sHAZiPDG+vEjiz{ zoDYf*zxy3F&Rt`0IE>H|7$km$GS(4Cnp~)7lkT5#y!UP^A@&ggF zN`gSXilms6U6lM%t|1xWj8J(A5j+H+!!u;24v+-SyS%_rImJ4~L}zWk2qjLjN&o;L z07*naR0=drN89;cOxj;H`x`+{swNkW=>gHgfy74ASRDbEeP;Ld`$S5 zaLLm8NQikfP`93@wk(%{jVUO4<-36ES0{Y?+b?nF<`%YXShoo;B}&gQMF~PM+d9XC z$9o)}%qhz;H?O~pR%5<+e8{|Z#8eQSL&S)b36a8?nh+_oJjn%UYlqTpwqnJ=7oUF2 zPbUACU-{JyR5=Bs7)=MLUe*v}B>CJ`ZftF{n4i+r^?%US@c(nc^3JkcEpnSJ@<8~E zWO+7=`tmjJOvaG35|hs)1(n5^V`+%i;X4RY z5L0GE1#7W&OHmrCYJhiHwjgBw`)qWi6qv7;w867`>n3J%hmHLs9zWjW;KjPrw7pzZC z2tKdSCsm2AG)hFqlPOMBNV!C$$f|aDz@&so3aK?okx$TO#mnb6xG*kx@59fiW))Ey zaE>4&sgNjT5YezPy?_)0lIT#?5T_KbFmy`dT2I->Yz5opcrUW|(T9vfPAV4*5fj#0 z3h#+Z(L_zu8+7FcZF zNjuXsJ)OHxpZumL_~LoHcNe6}Dw)2Vs-EfTKIi=2U-*7M-x#eViGs<|Qy$*?DbGH+ z$8<0vLeoe!v752HqUbL-S=(sR?j@|QU1Mcs9ZyM~PZ$l4n2t3|D+@e%JY?^=;b7NL zWRg73u+pHD;9oTkoL4~^ZvtgD?1Bj>CE*y)EM*A`oe1d-YpW?=`|2fb-&!Qkaz?Wp zt07I7u%^p+Y)M;&$|al(6piLGWsxIe$#^nlf9IekVHi|H5=RiJdWWn;4K7f42hK+1 zML}N9@wvs=2IvNlK6;mSbD7QSFVI?ABqwK~+b32Lagtyi6jh0o5pmjLGMWAdWgqH) z--}?DWt2721rcWEv%+*n4gLACPzVv0=${$wsAqcT>o+Oknj(GJb9otL5uy$RP$C$D zXVWRiyL%k(?Q?Q)NH&|1mpN4xd{0_yTFqt{k=iYiMgxSbmxd+9e1?t^S_>iAAnJJ5 z(2jxsjZ!`ON{x_`D3-X=U_GD{u!2TYa`{Tit;-i- zewV{14;UXjCz75tP4H4tS&ua#D%~5)rR5fFy-KVdQiU|+5SAINBuXnfQJa^pZE|{Y zj1vYgV!WxqRyZNZO-`fAnT|%B92~K@vP3!0*xTM=`}sEWGRJ92X$_{Th+K`U@pbru z2zw`8!{S2dg~1w2X-XV{H*bu>l@dl%WaRnaCx3=$_vlo1^P5Nsw<(4jS& zO`6R%M~8dNCS!^s4=FftOcZH!ti!&_2LPeK<4g$94f{)n^&x%6;xLs#$vBLCw!)hn zR}}$?BLWxAdWhl}71BY2#>so)8o4~3PS2+S=X@9~2}B1$*j+hi5%TPTTasJH+U)J`u(Pv^H6>D88ZF6>@phMk~y;bAO&z3>mk+_`YjkP_w<=(%I5qj>ezb*@}# zFw0Ju%?wUPNZn#EC@HcTufFz+^p-5f!iz6`5szkj`!PCBm`o2?T8da-T_cKuB;?F> zVy(g3aP=(mk}9vLyeEyqMOCN-GbyRcA!TvQlP7OO;#lyPSXkSjC=&{k(QfyUDhebN z>q(Nvc`oMvFC(F;0-^J>#p&#uotc-4Tog;VJW+kvTy(DjwYXfTW=qPlh~x{D`C7U5c{6 zOF`j6*hfQ#piEbbHkDTA-If)>*(sc%!Z9mKG$Jg=eYoysQjnuK7!2t?drDul=w=nR znA7Pm5H*_MRlvGPSYBDhn2No<1In`G2R#g%I-JlYmK*(v$({xL>MjQ40QaRjsuQXs9s z+i+@-st#)bipp{4#mij1*`xAvd?`U{oGlp~ zF4F2GJbr&0sS1QBm}eE$IqoQ+x|ND+$bXEAB9sngr4+^nT5GG_I=`U)l@=^hmCR-ns;WBIP!)>anVmci&n@thUg0oa21Y1ZOKJeb#^Ef9X2p@W>PzaL5k(-jz zI7AFMj}d|rf$);C)fCf`*8T~qH^eGM966#ylQf$FcVkUhlxxB2`UP6;E>&fD`s^ty ztE=ED#)AXq^BIDumbug*IWL*cX3S?Z+U*w37C2WB=@@4WSy9%~69+0nD2)^mO6!`E z>Cv^Os;Vju4h}duIr$uS?M#~ET`iRmd3aa4z-Sj9rl+UuZErChof0X}QeSi7!Xg(h zH@I>m0ewQ2PbrONdF>(>FWuo}Fyg_3dss5A-Mqp2`W1$!6UM^{2ZzrXogSc-M=J-i zLPjN*t~A-aeu-AU%bP!aj5mRv;JvK(yDESNMUaMo2|HQ|E2~Xz-(Da|EK#H}mB3j^ zSSGmeO&gl0>TwqQOx!k;uKO38dua{1C#q|88Ql#c4xA+#`M zQP5~M|7r_Xk!O@e{<$v7+Q45@N>SF_DEa;=j$WYD{S3Z61idpLs120=)j4K~_< z0gk1{78xJC`6J%>;SV|4-9hc;@RWh4RNzyb# zyB9glW`iu7b2>cbbZ~+-b4~|)w3y+lr^kmJ?mQzOAJa)S*RHN}CDOr}P(kl6l(?vDW=nY;1Ix z&9;cWLPvu4KH2B^;FOnMe1Z9FN+V4{D9X9v;3#J>7&9K_SfeQmK~aWiGf-h1RWW5{ zgS4RuN$N?{j81pR%@-~ZH6_#GkSOZciS89i5`4tE-U)f{sZ52j)n9SJszXn$4Vaj- z7yL|XWo-DSaTFs&EfSSyI(JtWInDy{0^w2wVVM^pX*QC;D3zu)-rsWIz zD=Uom4#C+^W6NylOq~d11c9NdjnvN9zkQ_wm)zR0vvLkyRkUU-|`JfBjX~7JKyCJsb)xHPdX0aRqUdFrLoX-`hh8Xtmlz zQOv|nIX*rmFDkO43ckmppvdPWal&Ynv(a2&JQ=gUf56pi*YKjjC_CZW3$LMtWimPp zfecx}!Sfw-6hYh|~+w+GiK^KRY=c3X$ zia0&lXZ!IzG*e!Ad6kWoCKoUEabm(eAJgu{BuUD6;#gR`%*y&T9zA-*_ULPwB~hfH0`(&`#<6j2o=2uG{aV=@^tIG(V$yvXq6 zDMv?Rx}7$i<|2Rcy&v=b+sBLtV`k$ydF~LTK#bNY&MTCTgJ#TmgsedUgwZh{R%m5t zHWl+pK~+BG`U@?hRs&P!7*kT2ASQM$00DiS$Rp~5OI4L2_~NgkU{zIxt>=DGYl#Bx zSe%RdlnU2AS4X0sUk2;$+dGS_|7b;>ktbwrm;~h=T6%^@hkXAJexJv0{SZ|Je^`;{ zq)CF3preFFtBDsf2=1%{m1Cq%>wcV(|Dw((Hf>onWvP&XP3R%u7e+ zB77X7Wsqt(Z%AT+irUQc5>px)X^ilad6rSxilnKCB$P!)BoxY6KKRL-EcM&;7Z*v= zCi83*BmqLzi}Uci@ZM5YMeQUAEw`5vXM^s`+3>YiNlq(+)f(e0Rq63UQWaHL_(qDE zF&L#-*u2Pp{Ga{j{QBSe1|p7Wb~;#RnU06Jd4X`AR;xu(h0MP^FUhkETN#$uR+K8cIOId z6!YleW2U1q{Z5CnQs^jQbMrO}{i~b~JU{sJ2Yh`03G?|Wkv1gCkfe^$bcdwb=hDT5 z$)rSxU=vchB8e?YtWm0oj+>;71{YRR78eWBIAd};rqyYID46GS64eYOg~KDJGl!0P zoE%T_GG;U^SXf+OI*IuHzx|Ni?IV;>#Hv-te5H6V$x0iJF(L?0bQ0t!)>Wu9B#D=W z#2AgOVpN(in>aps_>9$ymS!j9AD;O*gMr_k@4b~2Wb-1(EqZ?i1^(?Kas949yrv-up1sF(IWhyd$?8o>F1PbKSEs_}3{(|P)>4o4@)JoxAy zcf=i9y;e~3st6USbIgr%4re4waGdt^D8AOyhFB{ z{QBSi24DY;zrmNk@->u|LJbrMW{r&so(=pk6j>8ehNif|z7j%2|Na*UEMnu5*$eNoU(zWM2 zef%CtH04WQyv4OEJ+kcR99Pq6cIow(Fy5m)EU#YR;OLaC?Wb&Bxr&epj~+fJpE>3u z#p&rWw_m)*-B(^FFEoGr-S_#?4+tZl5b+Lug^zeANhq}S`9l8EtaK)ca^+dO`J!f*f1@ACBdl;hI^nWR|bD80v+Aih;ng~pRW@@+IjSC?mD6gAG_e3**7 zQ{Xj{1`5UT!HB5Y=Gv{`1PDPfL4X@T2eQt|^o&QRG)gmIdzT1fW`L zqzo1Ut=0JgGm11y)lt`<{wrbG?#}=eqDJd_lox2JI6U0vPrvZxJ3M9jrFSgDX9GX_yX&wAw9Fr5PR_ z^X!v|+b`ZGX{FTbEF!H@^?0D9LMed|7Gn!yB&sSHY(GIx_E_s`VkNM)BC870w1rGM z7$4JUEl_4~ob6-g84VqbvRPJik(YDIc}Ch&L|QN$ zp3>+@;y4W*rLj1#J{|vjeRZv+2|@53qyWwbpPF?ZBf!VOredr>I6x{g?~$!0Z+!Vn zeCr?neZKn3zZ8N)s|qDU2i)y;n9nmBNrbT_txl6zN1RS3oE)DJNllp-%tjLw&}t+U z-m`gO1FaOR8|%zwbGp4Q^XVkG3Z&%t=!huNbh=%#Y)-4yL@Lc_G~#41;MtQcI;|FW z?!3U@79 z4z1w$=qa(D@C$ETVQm$h9}p)&T-!>Q=q|34G*Tw>8J%{Q@yzjjZ@|@SFEJj?`00;7 zMu>uZW*lkCWI2z4} zBRE`n!WS0F&Ty7Q{C89)C1_jvNb zyClV!Vl+T{Nt(1sn@waKfe&&8Y94%%XPC0Un+oj-f<;r~5Nv>@saoe1mhmoFM=C=$ z4Z0}nDt4Z3lcX_sU%pEmM+gOR6!PnoR(KJt6O}b#U!oL){e6m~XIxoMNu|Y9wPZuZ z7$<2rI>aPovkWDm*Xb}PAXBU}sI)JY(;v}Xlv(It2q!3{->LryAy8>5-u3GCUt)=n~ceY>jL0gk3MeZE^jWz!9 zfAwGRw}0oiNjhzY!x6$difqLG-YzfPzRBV4bAI%rH@WlTi>z;6zzfM_JR?mbiaev) zY%?65qLrf8@3FtP!+Y<&%ld^4u3x`Sp3NDao?slzrc<){oJ*H3b8>V{RhC@8af70& zXm`6Pp;=j8tv#keM4M$(wzr=mrQ}Or{VFI$UN}kzi|ZR)xq5|-3mZJ!dd%Zb9#K_Q zeKz-XkOJoug0G|5t+QaEoKBbwPk7@Cx9N5Yj5!S|ZJ|Q;rIO^8B{zmBUBcQXTU%RP zy7(f8hsS*9+wXC>H{oD^K%<@V_y5zs$7^rg<%fUrBmUs`|BOfXcZgJs^cpX~*x=x> zLi2QI%FdpokqEk-h=mo2l_wNt#^oz7pyLJ7R);i-h|qXth|@sd@S=^Q!Os2wBNVz! z$mSD-QH-aCC~jbEi{4^~w4<1p2ICDM-ruF$U10OdOFY|p%E$NKLkdB+)27u(Sz77g zts%>E@~mVw3(boX3auIlXYsZS7g;5cy8hid$a71-zm8Nb+Uz|>p*w4~ zT8u|ShQm|({l$MT5vl%njf2h^tUDX^!kFcpMI|xT8FbAJvbNq^xzMJZ?Fa%!M%F3D z4&?)@C>Zf8;s{2k&pCYfK8-4aA_Hp>IwonxL`j5>k~(=O3ws9X@h%5fAY6$rbErZV zUEs%ydgKfzBcUY12y~=y#s)-IG=^E0 zQ<)%JD2jsVY*uT8z-6Ae)nK93Vl*qL=2N0hJD6*osQF#;Q#*-wcwZZ^>nua-JO+t5 z6To^O%d@AVf@7mW(G;X0rnC z1sfMOcyn|%1uN4)>uyQFbMBZ+A>8}$1D9*70OOIe*7`J zAN&k4Jw;=QQjJgw9miqesB}P*ID>Z;!k0KxV58h6_?zx}bX!5*-CaePzQrIgTSDsqo%W zRwdnjAE{$b$77JP*5uSyrh2zvUFf_jN4NsYVD&%(^*07*naRI%<1F(hjL ztNipxzpOdB_k92px~`nncAE^8xoiev9#Bm$DimDCu?3mDgYA(&a0>{mwf~=NZ#k z#&9@dJe`E3r%sEsnbf;pM^Wa)TBB+?h;^2OlM}Aoy2;&Fzrf~|YpkqaAWqYO?5S-} z=iQd~C>_!5_K_-LaD2@1(LUZgI-TCXGdAomEm+xn%6vWvPonxt7(}D~e3?lt8a=Cq zXWu}6b}X!S2~vs>GfPPQ(84e|*kN|KgBdiPg6C63 zq)X`r>0G*`nz-?7&dcAl5VRVDX&~49&EksCo2{Y( z*`fuVBt++cTY1Le#wmg1;r(esI{C4rn1N!e%DN_{peOz4$Y7llE@U z;^qy#qk|2zXS$fjEE0eofn%;p+2U7E*IX?*Fcdr`0+L^m>m@7OKFt#z#HncA`Q zAKsF6;7q=$Ob>O1a-=0tnXGzA;>(JxFPcC-!y6jjCMRnG8FMXLnS5@19uu~jvk-B0 zeZ9s&OxMW?N0u@XGkwoy7@s__oJ*sqVENFg8t@X7^fNuv{Zn36AYV6|ni+rliq3$h~_ot4R2~@se*xZH8x89wXZw>wa zz3Y78e2H^>+00IuV236eSM{G6Z?pOIt3Kt@#Jg_)A^b9Qy==Pk_MY%CQ3^~RRpO;h# zM`#bz=pI+#q@#D2Okn@|p%;1qpCs`cpJoionX;;`Z$?{#`h1gv;PdGncj8~)5Md%??4Q@L2aZYpv`lq1`Nq$AG zHrodkNq2JoHtHi}%99pn?gA)4olf0%D>MIXfY?%z9Ax2Bb)j&Jo z8&CK`AmFfWlDXzLJC0X^0!zmxwPTa7>vIIo>u*QDL%kKhbB?-$ z#KJ;)5iyUaJTzvyF`3t=NNF>z8?3hclBCs_Fiqaf`HTvNy2Zqvz}IKgxt@IFKmR<7 z+T8U3r;T-F1ehYC%uCGZC%$Yxio==G@KoeG&htYIVHpCB7d1`qZZAEo%jnEk89zcKk@@VSHl+h z@|oUNb(~AD-44$;KMj|CBP5)HC>H$lbh@yN{9|bw+CW`bKXVe-iw^AD-&xEI4(@E8 zzsGztk{U7O;S>{lSFYbRPoZg!^)p6HE649y{9F*D6!Y=)I~9NGU6_r~rzI?j@Hv>A za3Z!81pG6_>{1YnktavfCV?KA9K$m)sfKMG%+6ZNhF>-<6!ujLKY@R_;27H&qRD`b zZ02+-yjgt_MZFpL)rf^qb56U{C*fq6VWccY+pu%AKUitSZ17?Ifx||K!8vzks0?Ep zSy!N%A;)ca7?K!LTar4lhcA8m{f;y|QdOI%CBxHjL;Cj+nBrEhur$qBsEEfzN~ASR z5J%+e7lTAiPP@qi&a<=ggmfBGk+e#SL_s4WHreJYxi7-_BAmXPn2-PS%#p$B`bSwT`wM$p95Z)L3-XV1{g}WawmaNzdHZEpu3!(|vJ{K=rnwW$K z?-H~;nG0ocK=~|1d}7ML5p4xbST!eHAdb6@Cw59vk%C#BofN;_5x`R;F1o?i=cU#0 z{C1P0ZZS&Oo&Rpt|Ca3W>e&5G{CUxxBx_WD8{bwW$96d2H+rlx4OUD!Q^|M?^+{CU zKjy)UD7$GZerFy}5f6fxf`y)hn1oNFr z4BY2{MP6@N+~SC`B?W^v|E| z78ePp6+8X_;ZMx*_2+P}3nDKL(=x9)e7W3-V~}MC0=s(1D3!bY1^?saA`%1k#{o3e znA*(kYPNC?yn}d8JTFXkW%q1oeS6?s07#RGfUB(W+bi!QFb(9C(5LyanKTShh{D{S>s(ngM|5MU-6FWX(_nJj*p(qyu4CBryWW{0casjg?B@-{=auT zVwJ5)QeY)n#=)P`aixA>b8!xnW}9%G%*6EH=M=q@K#plEcWQX=WT>I4DU~EWm!Dp8 zV?0OX!Tgg2W7x$MI{wE4C-z@5S(Agy`6eyw_ypDTNGCDrZF(7R7wp4XLw8`W%fWC` zPO)=H;L~fbb}_2;PL*Wyl@`|o!{SI=@BXROnQgrLC#Qon<>I!dy6l>cj{f82rXibF zOGj~>PLR!>JaAoHT{VYVhtC{@Et+*l3pZ&WadMGn^JFUtE{J~s z<2tOh^`TPvd?FvvZ*dNe6}wNJO(OVJn=^MykYwgMTu-w3iq)EHK`_~BIa81j81#!>tIN4~&qvpYKFH zB9cQ^?9qRq&6!E` zb2=Bl&@_vORY_FLp9D)FbIAnTBGbVfo;+E`71VR_zgS9!1*N(3Ybl~)n|+Q6g(sT! zo0ddY)6cG#Zzkm>4=h#X>!S|bgv%=`&M!u)s%vZeFA);}@&L>Pq9R6c^>}-~mJTTm zz4yC)-Eq-iv^8S%#3O#YmK}uJ?kXXis+CFk9*EYb=VP6h?t&ySR!u@cXZ)5--+z;1 z*oE3mG6){cLIjQmt&9Ft|+s>!>4+5Uq*<4pZ|3K1KETpG67 z){~elL+W2iob^W8?|K4Q9Xzq$ASRr@g_OYJR6$o*@fX=B`fq)>S$LX9c?`*fOCn3^ zxU7fPCNvcs^1<1%ge8uri09Q=3W>t5^i#J&`J@NFr@6MBYn*%}96DNuWQlMkjgY*X zOkyI4*Vl(|FNl8?ONXAH;2Ji?A(2A5JUp<(qI{BW%sl^l+EfS{RRyaj(tltY{-vpX zyW}OMM1%H#zD-vMl|l}RiVMiAmE#QC`Y@ab#wk?7@+3aatb#WDaCgk4=fp_QBJ8}H z_e=X%?A>-V{-79=pJP;}XU9zNQ!SGMrBD^k2zszZUo^uUxXFw;qJX6milvO&b}0Dtx2d$2?p$BBRLxq8Z}Qq|mx* z=4u};8%tT&(9j16xC_h6+xz=rT1LJ}bn?WRun^I*8@4MVkdO#nI37a+PT&l6v_%5Q zI=&bE$xr-SyCHHNAHkhsLIFDMX;?l=!cY*S-a}Lf0a%)t5z^8X>vv0STSoSHBr9$r z#=>MjzWyk?zA;yE_&DQ#KjC?H{wm`z<-qM;N=Y_TrdK|J3H%ch6o&5|ifSjiY~ENm z!In*3&^;@!q${Vv{^fko$%#d2kWh{`ihb~c+kE!@V8L`<4K$0>fA?_3|HaqudOSn1 zh{RA3>rHp4t#{M1sp&Qnus%yzJc2;_M-58h1a1h@H?=>TOqYv^RL_gq=ZBrwWo_sE zz)JfW_W;X+T>!r36I7)g}Tn)t0_i%vqq2702;)ij6FURMHc5==^$=vwgnPf z*8>z=?hu)Ls9$p+7v%_P&cpw7 zUsx*dsYT|3KcQ2LYNDIfh383b9aP%a@?~yaU=c_xg)v1&3=_8;GpI>PL9{Q(GSoHS zMRxxRtGzIrQ#Xmz*x9+dh_9b5S~b|X`ZmayO(R8YLR&Pz2t}L z{ixBVn6YhQR+L|Im^$R-B97U2Yt`@Y`Ir-&7q;8?#$txKb?)M5k#|}q@ZUdIp<{mG z)>bw)4rgZ{MOr06ig(uhq~w$obFyRu_xD1O0+LLuuve&;o~K^P z1cmx>eL&50$)7bg@k~oGY8g@BY#&Xipr91-8a4L7P5-WP*?E{v9VKV!EmwiBJO5yo zwxKWeg(cDMqFCG`a?|P)K7C?QIq!P{`S`i%57LH-fCH49+YPY_L)SK=1Pck$XB++4 zWKt4qMV+%vZ>o#_!zy4ZeX#3<^1twR1?y}h3&IPsR%6~bVtfBM{exlu*f?x5(S;|{ zUHmvW#MLR}n8UYIK`}jv>R*^hgp7>Dce1KXJtn@#Lm!DSley_VBIhLBxw91azX?f< z=V(xTHV>4X^&9TIXKOpH3qE3#=rNTbZX5eqDTNV=XOcOhpnzLkfEmeVXQv9I1MlLj@ds;#u4XT3WbowP|c zgOzt?iiVgrarxVGEkln)EZR@R%M{a?ZGpp@n^+stN*-A9f0DR^<_$tF-F2q+`GA2Q z9w_bJT^G0BvI^YmAFvN^eOIs37J&3j935kUrSR7`*C0^}t}NyAwHl~NpiG&3z9CFj z*JXE@AbpHsU|^uUvOLIEcXjB1Nzy}w*52vxnw`?o{^u@}eNr5nRPg%}%}In7L6W5?U;$O3Jz%duYwPDAm4JpJ58Y#a>7<%g z@r}DnYBF0}sqn8NB)7GD{~Rvs2^jgc(zq z{prR2IUyMt5#0HXhltZ)^SK9b0C9Tn$PSqOt z$*oQUCu|z@U(gTV8$P}q+AUx$@31M6{n|eYz z(x5ByW3k;XRPpV?c`~#^kf4y+)ASd9LT@@qcRp%1moNn$z0$=nL|1`zc7x)}?zysY zW*;kwRF>qAcM4~1Txce?>W$LU7zCld>JXG1SR78b&Nuv2y)|O6DN`hN_ur)5=_S$( zB2Kjs@c8(N82snA7R>r3iY<#kGWXN7ZdT4sQ7a1AD3V-!YQ6;VcA{ETziHw$(B!RK z>;(<1b&0hb#yV7m&P8}r`Sk{mDb4ZE=@=UBEneEYxw)yT;SQi%FKui-p#t@6>+*!h zzkl<0bB=xqn;yMpd^^*-BS5`&zH`1E2diz9%Ab)bOwWG4vfsOmipESKRw+vCul?T+ zZXOH7qBCV3c~I4Fi->pT+`SwK7P#)#fMfmsWh#=!?Z&t z65v!zqW6SlcXEylPaU(l6f8&e^S*nB0wUV9|KO%kwAIksv_OTWtv$Qa?i(tH0hFUm zEJMKx^PbyfMBJ1BGuwFMo~m4A_VHu>lwECG+o;h?Lseb#f~5$Bi;wdtFuPS8$PLXr z1EOek?KI-aUHmuxm$1UB_e_|PktIy;3UIR~t*)&3i6$Y6OHm$I`=)DNhf1XKR~GTYll0lw0l zsxG=vPiYH&C%$6z^Z7P9TQ<*R;j-raK+$pAPo!gHBs(|uRy^fy<1bfyoeaY6RaHZ! zu$nil=0m|R35ag?8*voHVHYpdxwb*E|1k_4DTaHP)#`L`6M?d;@~ zp>s|Qb}6pz48i|d+URt4Eq>>Z(Lnxq@QJ;GCtX>dj6zcrk8~*Lz)1=+9yqlq#84M? zP;SP@OfoJ)Pfaxugs1aqKOOK7mJuOUOa1|Zq@Rt11=A!WnX>&) ziKM~j??)fRs)CO_7aB3U(?g5Fxfln*_6~;&VIHFM<}S7wTx_|uQO<=@=}Lm4f;3Dw zrJA;XY+QZTWsS?*Ctd-l1bh?xNk6H)Ws%00D{GjqL3m3-3F>sc>P~#z{E;O+G%X58BO9 zu7mejJ?c$s7!$P>(jHeM$-V&eAI5t-Y*8`_{Zo0=bhr^gM@92;LvemE4{Uy#{{8dj+!7wjuK z`+ANqciz*twhEWqI}o?=Xx3l>{qXJbEmcjIu;O!4n}oIKMGy6}F{z&nFE0rn>CO|` zC=zUEY?T@Ce$8UU9Hx7mB5G0Wm(%jCqCuZbh536-V$aP!5qnwm6yu@Y?TVPvTAy_RKz3ulx>fV}9PJgW#0hx?9 z$BAMAjgtCIhwcaRj0et6DY&6&dLf#EsdZoVI%Aq5rhR%pF24l!mM1lAn>$iRZYEI| z4#p2Lvj*p{{f658YG6r8(Tb9#^;xD*5o8$)3;3>EC$Aj=>I4<9IwY8rK!|ZesGt0@ zdwM?4HSvcB#OYRy9~>}SC)c#K1srxakBGf0U#Gn5KaP}xw(CGiN1-DlD45C zgZx)E>JkCc0_*il3 znhC%LE`~849=sVQzsL(66T(b4b%SpR$Yh%rl2s0Eey`2Ys{5AostT-r*D~}EEYaT` znkhyb*}Go#jvByQ^L`P9iQK)T=arlva3Oat)YdWFt2p(~CTj&85-88cmmM#!hVYgu z_*Wfb2V!APuAXD}OQZ^sk@`kPm&fz#s%2l`o|iJYs~OG@<4VcNgw+%o&V|Fne@PWs zZ8ca3NRu#9EG-}J{2x_%w{c*{#F)v$Z}HZ6^4|<_4<7J+47*%3p)btbP8{_cWqPsn zd}}O3H4jC9`tBiAh>xPdN>IsJYypeCTPrKR5+Uf?bUmj|wKKC_jer!3>H6z6^nt z;Uu!$`%NToQRrrZ=!QsC@VCP)_-3QjyZD;YSb`;uA1Jlwc$MsOquMT-^zU~5E1}=%}S6DPmJf2SN!*jK!Sd&PmAg+s+fH8 z`1{`nbkqqp&(if2yuU|Xg6X5=SE1xS69~tbYsWpLF3nb@_C+%gd2LgZY`bp0ZpE}s z1F(6T!l6Nrt*SiEoCJYDlvh;N*0w|##96Y={#v}S8uQ@$%12q(*fI?4=IS!zkwEKm z;^PU5rOQ?0m;s~@^3d6ahIKrYljGwlE520aV&Li3*3`)3s-VBl9#|K(Ff|QSD^)Dj zmqF{AX%_`j)(6yw`X&3hxp_?0Op9FjZ%LOfyWZL;!zS7E{x=XQZc3H7X*poKD!>k= z)m>sLE04#)Ei#!5eeMVheQtTE{O<+z^kjIicT@}h{}p^&@9A4zoF+Y(j8Vb+P$eQzo7 zSKNxR)#vaPtwiL z;n)l6nCR#7VVV9v7GRITmP{|xs6nu^nIWa`RX$dS6ed=_#KBjkG2Ue?8OonF3GwlI zgkWNqTDH8*0<}Ht37(aJpC=(=oSo+^83JyD02HA1*-=Aq#sjRspGZC-J<&6ZLF-|H zaw8H8FcXA?gbNER1*^wgu=K@#07RYz2Rjsh#zzMA5jBdFPab?D#zOgH^FLn+;;RS6 zVs(@rYDqLel`dl~!}5B%mHh%UN6&d~M84 z{0fEs1o3~KYxw6X)AI^;_;r!LRls4o#UX9}Be7bA23kN|UmtyABM=Efb3Ou>g3$WS z;tKFzwOH_x=OupS1DuwK1L31%eHlYhYVhv+J;JQ#xP&@|Zs#O{HIIau8QuhA3Pu3P zL5-3zedH?8FRiX^8D_0&?|*vWtZr$1M=JJkgb5hPBTBj6aCPfHN@449Y-BCE>-wd5x&?Fw);a}#LV*fB+;n_GzhAyZPB2J08{k*)P7qnDV3eA=VD zjKRn$g(+E*#&Dj#ABk_G8@~(gc^Xb)Mt()5Eq7ftlcbl6v(7o9HLE z^jJl2ZAqGXp4=6%aUzbrJ5`r4F2&RZZb?KXy9xITvMVwgx^j9i47@yRBH+WSR z547tdQ zTvK~ZleGwSmRCOf(ue>toAPMxG@Hn^&LH-O#B6XgScY-U;51EaW+u(ao(|=_y7@sL zrUb)>A$g#ZdYsWQr)k{`PTij>7?KHtQOleFhA4jby51CrXkQ0I!X`c4pHmtKh8VX* z*>ky43}fB!5(7X+yYi|8hHywA?U`t-Onc1f9jI{(XrARyg>~h`5>|I~0IXGkZW%X8 ztmoq`_gIlh;<26MHt3y^|G$qJdU`9(o(X`btV>B%1`}~HqOM$bq`-zCMy0%fK0{%&Z1y33$ z_teGLbIAYk<^^UZBtay^XriNvkJrt!`MR#rQS-;xnb5>im*kOX-M;pmkHwA`>^wSo zB-mo|D~KGxH{#T$Pj4c9rZfNjds|sm2{lLo!zGi`Yr5H5&q#0(*rqZ?u zye$vpMVGT!2C9c7n^oZ4?yWy&iyzlVQ4K-c^1NyzjmgfvyHzV9bL4wP?6ww9cabH& zV+VY|0$zVQd24>#1)Ba^ytr_AUriZr>ZD%WV0)>4hUok=AJ3S;LK6{UZVE=l;)o#) z!iogRJwYVt{ZIM0H8m@A-}q=$&P64dolC#aK2BPg!@Kr|abXpcG$yXT;mbD;>b7&L zl0R5WK9XS#pcBn!A;o3aR{t?`bxBZbh&e{?8=jY%u-&X~ZXVv)O1}(Lck#%PFJ$wh z;z{Bi86U%>E**_J4(W~)sZ$wcO1(P@93_Cq1LwLt+4Htt%bJayO9_vb6Y`78C4+wr zH<_dnle@EqZCTqt$UN;E$#Sl4>4*Bgi;H-f9;+^7*pvN9eaxa*u&Q0)Qmm(GAmLT2wut9vZty6*sAjE=Vc#!0)kBBN;$ zbks82*Mg&5GB81Y=;5?I6mfU^V*=O#qyP5l{;(==9BL4{X)IT$&)iWaBS;ZMJu{TJ zolo1%wR3coc<>EeH`Uu{4;(LSwElc*M#cdTSkE^hZov$ByW0!v2#sMhP1Y|btE~#j zMLy3%1DRRmE=;mMT=avh~*j*1^elhJ)?#(!qfIB$(nSyLg!8ts$Z&+&WIyl zy0EmCw|o$fz*zrxCQ7w_iI8Xng9}FY{0zD7km|-ZSE?S{#wJ7vEF>#)HGZY`O?oWI z8fPw(Lg+Rxyh+O}!C&&JYwbopokT=@LaVkf2DN|OjTcNJA|!OmBu{(m#AY8r9qdWn zX#Nx3v{-_~P^0qWQsWeCpnBc}e?TrOUUUe524wz=>->@sIVRB3nmqSR|AUj$3hu5A z3Fp-!+!v1%D;fdWO|%Kvte4Q>P`B0``|K#pR$h*)QY;r$kTZX}DI=z4aVfB@Hob$5 z@uQJktpe@PRny%a+IhRQuj?FL!S0OSU85>Es2^Z&vIuw*(hzCGnUG8NjE62WK}u6w z@Orx>NJTQ-)ihN2y`izEX_AKdo`e>LEdv$v0&tZak51#;FB%InrR7H0j7~&v@_)fK zLqV$Ks7j3*xP{5$Ba>4ZKuR@0VuBVRN?s*ER)#AT&zP8drkz{$-rd1Hqjl9QW~~~Q zMSL%Uf-Ms0Vwkmt<>(j17m5Y;@shznSpr}`)%F=c&;-PkXqned|1nTfQRROGhEd4p zHw#k?Y2oMl?nsa_KTVDcC22$e8%u)# zRWTZ<%>aYM0TGXL>X)sF=kgCA;!hTpE*-a9nA3cH9BdZ-OYwo`WXZZXO(_VAoGii+ z*Vfxs3%N@j9ZrkaidRR;p1Vz^zjViy-;Y4u$OSqAX(0tJC$hA1)at(Y2k>mU($ zmIp&M@~3kc^y=MQ0s7Q+XcO-zk=nMNGCeWJa;=GybPU6K>jLT_cIYp$FHimt*31#r z_5&-|_auwI(?4#E3enh$DCtDlW48U~q{FOJ*Ck?^mE1e^Y>o-GCz)dM)J$c%^nCfH z;n1kYLO)Nk)HpaDq~A}sjk9{lKc8Z-wa`o4SBhh)+lR_IsZnN5m_nqzsBOBv#~*pf zx&Zl93SlhKB(_9P@c2}y)6MLu@%Lk1i4^Vts8V9?NYryUXW4R+f;(KDeBIpI^XKfp zw|QWSkxQjgQC4f0$?l>xyV{P{aIFa9XqhOK&n`^X+{ItemStYSN8h4gTaK!M0eXS2ifQS?>i>C|HkJk?nHP9eeAi)Yl#Q{G{cCtcV1@;3~jUzEOCAM zZ~hXkJB%rUDFys^kk@!9+$t$`@zB4BX7%!ftmJ*yQPr zH6N)IL<$=@YQPjYOKVR=z)30_QD}5`0}d(>|KfWAv|tm&fSRMh0;!ruliYr z(d>T80q}3@mnE|{Q8Kjr0{ny1$Z18*FopcJ4-+35iy7_g9BOJhy6)~sfTV*_1y&2l z)W^b2)(u$xVrQ=l694y>_}}hU?ccQ8Ih30&6N2T)H5Yj`wJkU zW0J|?;nkdY|CmBXQeYj~@l*!-Y8xBh>t=Xs7gC3kG^8_>L_(H{Znbt)fLsM{$ zJ)v~Xvc9DyAw%qoe*){y57+h%E6vEu@SJTkWn_N%j(m;>^?Bi}J zP7vwVckG;ts41&nCp3sg9&q1jC>cB&la4rJtR^C5ZR?1^8*8c~H+?OJb=b$M#~QJd z1LNm1o&S1pkN}3QxscO$nM~G;G>r zg0r+Jt6gvSmzx|e#yS0l`p!w<8kb<6B#RjHu#z`6EvnxqLgJ9318Yp1D@P(ZI|nOJ zZwA@1_VO3dbalmfhgrbl?H&mNAWTsd=Z~jql z;GZv0VgX$*OD>7A!IgY|cPf8?oSagP<Gc#7!#P(dizb0_gfxnlllzjssNIsuN_m)wC%AR?>*O&l zo_w;I)ko9)vO7yLy=A@N7)Xu;^S9(p8(OouQb9hm^#6UM7#(ZC* z$)YVeb9i&$)`F5=%yUG;7rb@Bahrgmt`XK!IE=v@|3esD@z$`;iq@^sFQ zcE7nY&0dhd@(>803u{X>Xs=~@aC$c5mhM|5oGnQJBO?xaEuvSfwvlKfUjeflQk5P# z!ZhA_j~2LI$-8gdyhMG?Jfo7B4q`co!)Y4+U=nZP*HbiSM zgxdRhM~Z|*<`bSTFRayW{8JgDz|CbAq%x8bqF;Ef8 zsivpBaTzPVox#~zvxx>h>`NLkKel5YWazNzGpDIz!cn=a4Ez~Tlsc#!~0s$l$ z;A0z3B@LJ%vGko?-`=JQLo{+ekGi>OJi>t@7l7SH$Q`VQpSxcDYG(6)DlrZ)@Jz+UmAzvdhRa_?!pa6~LTlTv=w*x?e`D_-PeYU!9YnrVw zICGjAn3?2ME*?(b5ng@qeJr2;@UtZFB@^lx>hJBGr5?IP9+)BV$QCkt+VHROr1XiX zO*DSdMyjXBav5z@T4}YX-46dr+HFV zXU4 z7V&6#{fGpQ=k;Di#xJSGj5Exbn2}K-`JUH-|9$?`ppHFxTp!M8$}&sp$&scwAeWVZ zIij&3o$^y0RlOP!TH-lQK0wXFr~O~d;a%?xa~>DvxGsT9Bx%ww`;1U)9!e8oeh70f zlx>=g9@c*=k)@m81ppI7k=h`IJ z#g%$B7A(~5J`@CJv-nbMJrfOe=Vu*C;s;sJXCv^18UqhegCOB*r9o67mt5a%D!@Eh z&Z{j&YAiDj4Ywy#v}_|55B=`~r{bIoyA#@rfqDrCMGQ*rayZAXtUOA6lTY;&W}RCT zua>R}G+S+LNA~@2x2?-&Z7#uQM@Lu_m(4DSccG!7iC}s#q<3$RK_y$H%SGSN?>5e@ zHCjWk-2pYtLP}zA+mQb*DtLaD(~*g z96`duywxp>N3*qYJiLu@TcQwY+mBhwcYjB!;?go{e=8YQL~CHIUjmvc!q`7sd4g-N zfyd=@nbj-HStUae*)7kDO4H48)J0Nyb=*YiGQt+-5uTWE0AfE$9!boLd%4JdiBB=| z`dL^g?bZG&!FrTW9tY0Qq-bt-1Vy4BV>?{Kyjg7b%#X{8+W+QlrUS+f`d^>p;XNhS z{>>tQ&mCQ*(#cmlo2KwiW7@)~L8Q@6q$4D=nqbE(0V%5I4D9zvu7>=y=5NS4h-G!PHV)QqZ1)Qci<2WtzqgIJY%?p zoCEy_d^APve2xIldLGtEEKJBRlkIA+QwB}rDbdc~=)8Qm;?7p(oF)RSR`b+x)Na@` zNB>PU4At`pa3WQ({~dYDiy9yCcbF7LTV0o!jtEeT+EQSUkJ(Kr;ct?^$V48}U>M}< zQo|^a(aYi1#!gZ|#wd&r_-C468-8r{YYgMYu*{Mq z0YCb{hE;>0!|!inP|@n>zaem}1$8*0Uz8N+`oFWA$IzE=b@Ae&ExVzCaUg|Y?TW1w zRu7XPJY;Ry=f0{BiNMObXKo|E=QlG4scubu9wHVlmUYI}dTg8(svJo=x>f+-Lwwzu zn2&}DT39#bBgd8o4rQ1o?)-a@2#9a9N#ghQ9O3aHVYE!(l!qb*fx|v=zh*^@>2kqL z>fA0tvFw1)zu9@=}9|L>!Ge`Dl-M*wsr6pLrNE4tebOEt@Y*WAg}J=B|X1rf>F0SxG)t-C4RY^3(7 zCWD>d#8@(s#vIaMD>AAVBx=}xylKTpkZ64&liV~pf&c@kT0%< zhtO(7Qa72J&x5kT;mR6B0~v{>{M6ZJDbFeGURC)4N?$Kpq<&8cG`FFlvzP)gbcy{=8AJygOk(G zG&*@xUh%Y4v-p2x?%K=nzMOf)(bfM%pbA`EX)%BYXjpZ1)-w_0Uz(QwRA}OV2#@>5 zP|kM;Rb!5)lV89;opGXxyYRudSHPL8-pvEVH&c~e$Sa}F+u69c;u3m{dnY3SeU zM*&!%39*N$)hr5!l}?p-bA3a@T6l*tzVx?c3bEUb*8mbU*syoD4~)4rw}A$(?ErDX z|3Sd$tP7P2nDdfK-c@8!XH%%It~L(%c+nPC!i!>1;oRRtjrtHuCoe}3-j#<=h zs%J`?ILVw}=X}qNsNX|u=O*LJRqVlaD3*+=S}C?}98rn=fE&63Juoi!(OKav_OwlO z-f*nobDiR+EZh4hu`IXHf!NONX9dpl3)ZUYN&SuGs!k6639p#X^Jr2I+i2TMgOQ#y zK*pt8!9yBNtTHOs1vQ9glSWJ7;@eF+1YNb* z$Hc~>eeQJX#Yde}EEOAR&sO?dnCQ`AS%OlU?vh3pjnaYO$x^oB``bGc1CF&es{tKmxsj0xC{%Y5x_&pe#8yG*B^60e^p;jsy45t~v_mp7&CiSUs zg|6D5zL6wacBc@-51ZO9G@ifiRT5D;M^jD)2Jbhi!06y{Gn_Rm+QG=p`o3@R#(H8B z_CL+by7?e^vmM4?Z9B~GDy49}lnuqB#J-)g`mih+zTrkB! zx;J!_sytfB$=U{nTWhRUHMJT7JXrW}RkQ&~?O{7TOAND-K^kX1tKdO;8zE|#A_N|s zxB;TpZMGs85zo^vRjc??s&Ob)$YY4Tc`FukxcNX0J58`eFD&U@TLZ|FwcXpZ@AHPf z!Am6iJWm^V*}a) z@HQYlsjR)ZV!k<9FLqtsy4nHU*c~ta0=Cg!J|aZqYaK4ABaH{&ge*K@h+Eje-JKwU zh^V}>0!IdCR(EVt$aq`|16YD;vlYu1%)2t9;YYPB>!X($*t_6Rqj8>a?jTfeQ`sxob2dHKD{TX5F z`$t~8@|BBNwSq4$jlZeJbfO7|lu3(hXTi#TJLrp@0ykxYb<=%jW~PgmPk+}lv!!Lq z)xc+&e4HUCIiBdDT6_iV#MdeRl1Q7}_^tSfm>)g{9mZjdDh?5%nIO?)nB!^l!#R%7 zWmbN0Tp0lzI-dk$+U`>giL%;P`|Y{pNnG;6A?LtRsD78mgIudrywH)6{$*EjEC|#_ z7r~+(vvKhl_B3E*BHxptl8`91N0$aI$To1hd%Sdn)_--ek8W*h^mv*@U1@2T)_y0S z#EsBR{w-sCkjX}gt0IF8QxKz^ZfOQ~o6y>2mrVbLDu5*3Y~CV6(wqyy6>FI;c_QM! zuSM7fd<6C92XNm>?0*v7*6Mupp3~Bjn@$W2d~N7|{AJA(A>ecS>@DJTktne4lQ7dm zyQHPXcPL{{e*0=nCV@|xNtPamr_#DOs4d8Y0i8(#>W9ynowZ)fGly?9PmON zO3KsVZ~+<@Vm>dvLD+3)8(lu2_WG|!6#w0vu3P#$#=4dD?e5Y8h2PQ1$(ARj|I@s` z5?sFs2eLUfDc0c0nNYdP{9uY#Q?)6n`aww?WeFaAS|Dq?S}eX_aO%L zO{~cjZ0i#lSgKNAkN@_Dk^{;b(3IG8l7s8_-}r{)Q|BITdcne#Tq29>_K`x2vWGDmNA2q~As1UKmYWzhuIxF?L4{2L}tNwgv_VMb)w z*7aZ{jl=?FvU3f2wuXzig3S$J zN9;z)dx=(ZauQ#US6}*qyHd)lJ~q2}CxmjY6~R>*5=_}fcI5S>y?AH1+YK3(U+o-Rf!~3ExUoyJ3wmC$Ydx&jw6_kiI<}1- zd%HvJ$7?%a?aoa<@G!UmdURu6v`R^iLjve7P z2A8{wg2KzKBBCJU+^G$qF6wFwXEE2c=jFuk1$J$W{QXNRfvr}h0rk!9X&0TF(}Z_4 z)5)th@;5bibmWOs&RFr4Xs}o$P99Dj{wqlwIXXQatL?rk_P>&S+!N^B1Olr*_-`~y zMn=X8+{JSI^~=QwCzL!CI0;qr`D=DgFKfPHkNc)Tn%C}^-R1P%UJqH~Q{~5=DKyTH z@9ip;GH_KGQDdrWGmHdz8D(YF2&X5W zU32&U(R9vHmA?Pi|4fr>vN@e> z*U6JzlWkj*HIv+}~%d-&*~B>YQ_TU2p9D+7bAYJtq&c6ve`^2Xtj; zjvg)(#@0PL!-5d)PcWgWr->VmpX7hX$YGZr9X&u3xmqsFQY@c;y4#HgI;N$H(VLU7 z>IjM9@zqAIwavqwxAgu%C_vk_h>e|2K;-DR$=^?wO4Wh)86=^o);Ezic zVRZkziS1g)`1vYlwRTe0=UbPtV6yk#uX%d;(Z46v=vU@qxwMi>vr7!&%UM^==X~c|k^pryv#Yu>?b`hYyvD7jQJb%>G#mOsSbnZTRc;UIV10Q;lILBMV%aC55n_EoR#72m@Q z#@L@D?gDe!?FYvRQyaI*8n+p@wUd{Jgzp^bBK&AW@_^Dm4Y6ibGZUk5$96#)Cl(9P z=H!HC-6~&+Lg4-j1jnSUNMs73LQ}6wCZ@k-zgsLzq*E1$w=?K)@k-jcM=?RMK&stf zC?ml!(6j)6feGw)zCCB%9*r_uxWa6?L(ZeM3kKU3isHw zQ5-hwcC}aW8&bOEmo~wIw-uoQCT5jQZI%iQYU=9de+QV)RiouxN0hlBBULUsZiG25 z+eD0Pf)7?WA`38qLFT?=pkuQXPP~IQ@+8or`r3LmARslNm~wEHLe>S{-m>n150HJ{ zV3cW0Sg4=RZYM3+(&9%{cF1xxE32F8hUT5aT?%`F2}B^Yr86rqr36BQ0YGP(ES&)} zURv{jKJUTS(NNhZVH!TC3v~hra5oR%-?I|~gd?E7Kz#8A`ueEdvGyW>lXC4gc74qZ zxKIIL%Ijt4WPd+Ep8h&oV_vW6^r=y=NiK;-lR&d?nIO;q9{;%c`Fq;FFN3FXd1H-= z*9t51bjyQ*RbMdG6nItW_Kr{yTEsrsKO>m5R#w`LD-_+W$@F}i&=Vyz1#{YOMTdD3 z%#}FxKBg=aEdD$r@N%iBsaV08$++8D00EwxeDe`EdJr*~^y@fAV#>58mQe3`8s~E_ z@%!(tYOnxz_NGNn4MsVOV+u(vWWqnHlvp!dP1Anp3E0HJJZ6~SU~OG(MVbV+rx|H= zp()$?0}u89_UOknOwQU#8#X+J(s@9IbN&mEVWDf5Mx60YJDZ*&mx5CS`jk&9L{}KRgo>xXNT$;uvtuP5+t@AnEsj*jt8Tyb>R|jJU&k%#tS+v+Gj; zRVRfaL&Td)+3<<|Qv z@|c18Uu~&<_$0$ttE&*WVj7r;yNzAwY(X1V;h@rEmvJ*mLmt3y1{H` zxmM!aVYAI_m9gH-_TPk%6xpD~d^q)nXe{Mm_K{B_1 zKk~|s?vLl66MFAw0?a3O$I%pbXre@_IHQJwG1R=PyE}Wo=f}Ub6-iZc?k$|d{E~|< zf;A8N0tz3#9jhxT1~CrhhDBhAUYMsA(72#Xx3ugL``nYvufTu4$$vnaw5nGGH|SJF zu#qr=I?XoZR?(IcLk+M;yh4+;eqEQv^)pc22=dfN)w*VMVT$HE9kD7FR48XGTWH5*aQ!e$uD&6uP0zzI3 z0w*`Op^1zC$-W^ChK`q0xB>>yU;Mua!NzqdUJVq^0<>{)SQ59ZtuKpNz0iSS?+2o=ytAo%@j#gj?)mcgo)eoty^Zd+mn(hOoJmkr;j+Qpm}({O~n!3 z&v*5<9pYK)qeIyG)a{|IjNT#fZ>+y;v!N>ayd<{3Uf0uuOXfn0%zOGekjWTLHV17_ zAREmTfAM`>{X9je6paRV!LI9W61AkHw(Et*=h@F^`R74bU+K!({@Qi3yU?9mEltgy z1{;re{z#9EB%%&wx9?E(9{wJAlC{fZAyUx7D#ju!{js~ihqZ9el_C>1I!tHLvd&>p z@K8qnw)pv?_x=luA@$HQDq=XiC>s}ro)$7%0SAk+!ywj5A-;vij2Gt$s2KeG#q|s* zjb09e`}~O%;k5^o?QIylkfZ`H#|5qa)O>}W`Nux|vpF)BO9O2(@Rvp+S~O)-#bD&R z)>B8yVnm_v&h_spbZwnX<|s5`rwf(IV;KsW;agsZ>ccH#i~z`pFSl#Ybi%7 zPRA}AANhMToQSM41;rdFbTUyfRW;pDcjcZXdaHVDPk;(_1Z#)De@9XIp}OI;pzB$F`RWZ+ z)qA27cXgcN#1AdzHaJKy*8EF*9|PVk?Hg|NK5q71Oxo`hl$2axu)ec%!utC9HRkoz z)nAWxxz=?tso}Xf3}AxYt-n>Tz7X5TOblQrHs3e&49oWCKQB}|-u5^3eSMRF9ej@S zaXH6R6CGymN@Vrf*%=c7BGpJN72>K14(-_ZrE+Py`i5%~YMx-whwJH(o-k~&d zrN1rWFzW@0s>$9oA$B)ur)mH#wfK?)gn1)i$@u26P81Uc)b^Fk)0Q{OgK8lG!g&7n zQTeK*awmPozNVr-?6fF}4s?R*ECzf3_2V&C&8q}fNC7-hBdfUPK&}Zr@Z`e+NAHI| z0nwL_FdjZW!Vm2rJMU91?KZdRuaH<+$$IMgjvfGO;@sWvK4=pI8l{LM)!$#IB^bu% z^q5WxE*@j8!#TXaV3&Z$XU5k@5shF;L4OjwNug;cnr$M1CRw>@#B?-m>ufJZnty}; zZI`E(Erx(seP4f<1GH&obM$jv`#quOWs$WRwhc zWwEGQGzX;Ot?qZvw$}+p^<=&L=_03>HF6iuR01Sd3vloJug?k z0((65FE>er0I3BLxiL9IXY1nytM+#AC@EO^8LRl}7BRACL}4MDQJ+DE3uKZrLR}BC zox?T8^?l9j++RbNcRYFHx*5q9*|U*WbenIz%2gCAJFEKg%k3@-ZkQB8BB4ixeE9)h z)HUg%8>tolk-GMe?+`hi2;9uC=WFDRE>U&{pKVE*)`6ZoGNm~5xl|k5^0J#Hba^N= z>waLb&BN2m`?(XoC)y22!_ed60BU8X=i|i}UGcj>Mz8ML(Mnw-Q`4ZD5~c}5n$c$j z>?Yq$r!AFyb?ye4(se^aLqCsN!Nx@+L&w;Z6pIa?QyT$V_?-hlFl4LS*=?p)=?E;? z8MIr5)H+@;8MNEF1_r$OUyg)tc=HnfNl=IM%D9MNOfO_d%2U8^Hlq}QVkC0O{&m)# zo4}hwW_lKtdh8uOmB5->2YJFmxPTeAVJ~sSO|`RL`#(0-!(q*$V84l~;Ds4Gl}&Rjf71k;-0oD_A0KSv69ICMIGxJp~SeosQ{f!j5HLG|T~; zz_fL2AGHD+OaSl;sRILyMh7K#M?j?I1!bG9gMbVC-sAl!VaoT9L>9kQ1gWIo zd@o)^F;fF5%3Hf(A(c!@m?TF3ebAxm{&y*H`)Kz9p9|-u5|%JoEVyFYe9l6q&U{kl z`KbuJePs_!oakR#ejLGXi(R;XUcnahto`sP^`8eDGne zO*^}B!mX=-kN<3v?iT(gfQdAc#Q#?3AW`ZS@e>m4kA@ccLyTJWHyWl?{M!@E=D|SW zC3<*(frZ-?;}K7{a{0j67#n4xT$P(wXmPXT2+QukxTkizL)=9-)}UO5QD+)@{YjBa zu;J5hs(A8U92hI^y_i`QeOkNqs+s9Y7UNXM!wH*>r`N3NUuQT%cGH;`_GbGOoE4kdCGaQr zscOokp?M)xV9v22PW;#`5fqIu`+IyHm68#?_C9lS{*wx!l8J5H1OVG;O?{G^ePF*h>5azm(Ok7a%(r>0X# zq9Gx-#)}G~x_7iAikS%1qVH-8VOz6q{I#A=5TptvMC{V6@VX)a+EzLMB?wX3`N8eq z{ht|qLd8#qK7fb$w3DR!k14f(pZp{ejyvO+8FtFZ8&LrxZ%#P2TAYU#3p*NBl-bHv z?Z_48kNVn2u);l!V$OQ~?rUo;5;>U#y{J{?CJO9IIhMaqP{YJz2Fg;&-fT4g-T-CR z%&LGs_{fMxHg-+|pD16Twr!{bRRQPI3Y#NEN%*!XPzAc<;T={ z{OD=yY8!){I-KIJ9S=%Fze5hL%ReaeeQo5u-6^HZ8bnro>04O-<7$88$gI^@9BnQGz8y%c~|6+ncU`WtO zmQD5l{m2%_C_KB^q%2`CYW-sOW*nU<%k{eFwDz>z9<2_gqxr;Y zk1dcEG)rp8!ay9vyjx2*ER=HT`hYbQpgg>t5iHvewI(sL3JAzwR)xpLq7TYH(du;q z2w1XH88c>!A^g;_ZPq+#zAdc^_2V!N-8tk&uFg98$=);fag0QP#0 zFa0jMT0}^l0MDQuM=OF=nq4FDc4L3kYqzm;*a|S#A^Th{_T58I@_zDeJ{@qTq+}U+ znBvhwhD#4tO#mEeNp6O&%>SG)boP-qP#N5T3#MJn-=}g9fPNbL3l`yu2Vam*5g>Om zliEiAie-~UG4$*He%pX8YMGJ7%EK<7kf|_evZS;UlBBmZ;zF}V+mQG zA(7FW1NW}URpcNt6?~Fmgie+Ua=3(Bimh#?M>V@+KK&j%CR|qmkFPdHxyG@PlXNv) zvhDLiebjMEtN_D}=MMU-To&J8_@uz#xmKh3oKld+!1eAZP)y#eZa(1!!@vN31Ymgw zExE%f85bAlb?WL9JU%Wvg5qddZsK4NBUcz%n@ASs_FCT9@7Hm~^QSU{;~@=c}cTVw}uUZp4;?hNzZQI1#0LIVkhd{jlHPux+tOjOqU-KE?9 zyxMd7=BEx`IY$!FC&YO%^$L0%@K$$F=1wF3Ba9$=zJ0deJVG_=>V4Gt`_Bhq#j@Ul z!}88!-J$zdS4b=qrXb@c77FO3m>3*&hjL_Pd=6272N9lP*bV$r?yo?;K z#|xDz9`OTBHoq<4^WOH*jxjRCsgTP_DHFV+|9q-aq6U^8uvYGm<(y3q*Ww}nF|Y|u zGdf1&W3luF;ac8v*E%`vxlbJU%epiWGZ8#gPdGkK$P!(Sp%;hb1P%AkTAx|}Ded`B zB|@H!@+_Ixve(Oq47RL}0%5fnU#-&V;0#wTonNkW{olsL_nj6PB9Nc8;4{-w+o-tR z2OshKUgc23#Y`ezK%Sm?M1r!adrRJwdVtw!68XYQLI=DDuaVbK*@RPk03?)(WMivv zf(*0w8)DDgum-#$+fwB@;`EN9zDLWY0^)m^Y=G)+)sjiZpa)6 zm~oJ}&WLV?>q~VpQv2paX0dfnd&;|zEeDqjjhF}YZg;>GvT@f40v-+d@oaeCTKqqH zA<(Vt%Gyf1aSjXq>*^>~S}|GIz&Snkk5)0XwbSaj5w zARLnJG?qBBZoFfqw1PaUww1Z8KH=1JIdBfB#j|y-;{kU+8>Xd4d4TZ|^cEp1c~f$? znxp>QRb<8cg2mz4-F} zW1ax9Mf>>)zR`BW*v<}FC&Bog@aE%-Ls?U2{h)TqRLP$*`20E&L7w!c8J?$eu$P~M zPg)h$F`K{PQ1>=}mbW96nKW=jCZ{`**#ydf49Tk}rlbf&KYwTWJ_wp3+ig*q8!nrlPe~w!+!oX2+i-oBi0B)DWbYBLN1T-kkHmJ#GIDga_xA) zj8zSegyF&HEfYOE5Dxk3&7RRlgHhF0OyZTRqHuz$@omoo_;((B zfRG*V4N4iNsvaTeX3N(dI3REWN3 zGB_coRm+>25pON^J>dp>JcvVC)vW(pH@CmMfUlpMHG$$!oGgw>9EEvw@%->qPAE{z zwqosYiEI%@5A#=h3Le(F+7Fwu0P&K~NBPPBu?FvTA3$e$c?9;yQKqD4=CCq{x}Z>Z z65Ln_Zg}tbL?+e#pB5lJI&E`l378*b0s4!zwYIEdjZYs8yn9zf5RMksq3LvtEb|Uh1?UeDLDqc$TXE6AM5j86S_4BRR>UQFlDtSJpPS3u~yf-P~X=FRznEVI***^LZv-`W&{V z^E#wI2XgUu+`wT^WIU3M6;uEF_YdrHhQru#7fZa8NNzTnVd4#(f1yagcop`Gmewji zX(?44LEiaM+=x_>W4B5IRHFqKAHWH}1R0NVcvxOS%o=ING(ftKRj(*PK zVi*@gXJMqv(Y7+&3Wfv?j}pUpli^W+aiUI|eRQh1J#-Wm?ce%X+&M(lphBevQT3!= zo?J=ZWks!|RZNUbeKHR>V$n?tSrnBE3O8H62cphMC)4FMmmnJo$O0~BbFwXE&pSVbg2`mR=SUQ4|zBfIgUPx|GB z)IjpekjIj@Y$Y~oXmUx>(E}1y4G|FC*c>vVK4OoFi(R1Kj$@=G&YF0&&AF4T?slaY z(5noknGZzeelQt1?;~+m`t&#^vhs0G&h=sBZUnIPi=x6;a{E?Q53lpkp4nU~Vs_YL zt>gwq58^4X(<)6*vf6Gof7Ntq>KwICjtiu^lG8M5Y8~#Iqf=Ewl$I4HkHv~JW@#Cgd*{?++jt5Gr3fn9G-rhuV2;|>AKI1Y?cTei zb0ByP<{t%KJ5wp~6=R3Z=BYW0JwGzuBX;W2#T}^r23hHh#&EvT72FkedM)Whie%@# z825Jh{OTt*S@fyE=spxv5kJ(($}%Es&(*ZD;7F6HTUl#%=#9fE>(}6lLYQ6I3OF1g z4;`?qw681)15HxHUmDD<2;k#gYRoO5h!Z)?T5}XHo~j>Gjrh@x;uvo@Y^Cef0AbSu zT=C9jYi<3joljhp@&t!Vp>Z3PM~E66#x~A@Flmo5iqqC?M=~1CJF0Ubp`bD>p<-!sy+FZgyUx_i zDUOCL8pkXegHB*+PPBWsd?!paq~%G-bzOpMfaW~6Q9;GA(d zi&U|-D25Pa9lPMc7O@zg&k~%1rEOcm{7O}Ot9a@9j{ht4WK?(1@}Dzf9I?g zoJ7En)b#Uv@1SOi6fQXuLy>eKUww!*B5a9TnmYq&xoQ$&k`GGAe)mPi^bl)F;AqDD zNv0PVZnx_q^K(U0QJ02!{>gEE>w~)iJsugtARu(G0^@z=-?VBKQx=+ve8(@d7oZvS#|+*0u5~dFp+=R{s;XO3KK*;tN~e+ zh=_6l1->a2frv(uq^s-9sk-ybKJ^l9+T9#XJyLt`Vr zm;vg9gxouei5zVuV}PCNHC9h6U(;46p|EFtd0yS<`vXl{E|XWRc6k5~+mQ%(7QctZ zUSoRn5#o!+%gV@H0nog^3;1l&W0hXrVW1f{@=+FFmI#<=!O2~=@4Rq7`b2sT+vX{i ztodP2l%oSh;q$}ndt8lMO1f~2_m~1dQOW~Lt_<5z{jG|;g@Q4wlNbVg?aBp<+04Oj z-+=*QRc)>C#wFU|&u`LYVa%GZBwh-Fdm*BI28?FDuF+z7$6u^O|IkaBmXX^whKfqj zt7d|iiS_G5!C9&7BXFS=0;2|7-cjAX?Cbx{wBIHCZ2UX&J>3fRGyx5E=q~1s8&|4 z&EC&uWDJzGcuE#^^&Lzao#AY%-$PMot~CPx3Bd>yDKo47(0Gw!2qi_ME{2PwgE!R5 zHMFx~na~#=jKPGe7*Y_b>8uwN9~jH%7!tG{3MV+c;`$=QM1V9DBz!?YH^$Vd33aO)yfI~IB}*XJ~H!ceNL@9Mfqgi57jzv79~jr zYn95swak#b%0-Zb=l!S1Nu$gH>z;vq78UQ3C%fxb`UJb)9Vv;IMcm-2S842S5!&3$ zW$XI_CrRLrsdj``Uhh*wNQUP=Us%RgjiM|{WVj`Ssu-(?|L^d??c(`Roxfph;sNP@ zaNfs1gT|v0F=QRWQLzDRvMI^QTWim^>D*4K03rIKd?RnjX$Smp41VNvdra!gUoK+h zVii@EPRYmsg(iptrRDd(GV+t4fb7*%#mdGIKSDW8X%+V*S%N`p8={-7Zh(eAU-_)D zGwnxS0FqTK$%UnCLv-DQFKE+Ho6Dwyf9e09YBeT_P0NP+9&ZJ_Lsjqtb(pHGjJ>5U zKH(n|Uhp;DFOs&hu9m4t_W~P%Mdg9Osp=SLY0?0|)fTm$nv!vVki_6n)j3#hrACeX zIP_I$iKI)tjCv>>(Grf_&(^MM?0X)3>8d*1j7OZRrZ73RifwTreLjkE3mIxAzDhiK zO9@J`uYp(!?hF?lCYp2%ei<#3iX;tvXjPM=#KL->e*y06rO`^tzsKxw#ShQyUKM$m zwQAo?@&1uhm;5k6F?A({J?|RpSU_J%CH>Em+OyRA!uJi!(d`EYLQsO5kTgm4pL^TL z$8b1YgN&<~{e>qaMXE8X!3n(Ft!?W$L+u1387NRL+s377J<^{{AF<;40mD!oQM+9t zfCQxteg(I_uc5QoM3fALqDNzX`NJTcI}{#AzY!b5p;%YkwxdUtzMx*v6EsxW#o55& zzS9Gh*<_EZfa}uOm@H{@AWx@c5gA6x(a?DOkoxi1hpHj)_-|EnM93&cwRL=C1l~kN zK{-MGsDcHlCcT7ed39qSA)0SuH(H?kvGbAd#h*V$QCArsbeM7byIsNIhMSIS01rXA zYj`;O=i`fzRT;Lv=4tnD!QqQ!<<22)pTv$gPH#DBT(T8AF1V;EJkd} z3@kbI4MF_D)3K6v+po~T;uI#~xwZDjfmdR$u7?W-Ab(t%_w&uEtYTxAvGY^Sns13r zES5^XI%GFQa|l!i9$_&vF#&Wi0RLl*k?v+>6gV_qoLw3ki^<_cV`?4E0uit;owjF0 z(=n_sFC6XNfMi`D<`~`x(bJR1SmRF^nyD$G;$ zLe50n2Gt)t;W1Z(Zoq1hkyWg5sXU9*rOVsaQR{VQS6OeV4R1RfauJi?13Z;$aD%vNC*2y6%=TsGvQEDjf}a9Enpvely(P7W1Gv@ z0l`}=^_r1Ac<@@;B7Fld&;lRR(a$T3ofBDa!+?>xFzX7S4Z+lVagPY!f3+#^P58-= z@r9IlqDVPpphi&bs0=0y+AGot3-#G{EP%=rbu5@8pV4(iHj0ta>0uA9F$E~1FTag=ea*7)&q`it@k$12|+ zW*%WF$GDp1NCWBsq8S(QW$uK1CC`_l*ocH z6XSgSj}F}rURpJ=BhnSE?2AEf=>B4zXaO!F%l~?-kA2tUi*uA+joTKwY7&P&a|Gpl zi^zW%b8*RnF;3pjktyhh0MU5zfzd}UR}m{o?soWo^=*$*fMiD4!$h*cFyNNHCq1G zF2zN3O21#lH25|G4uTOLJHT^DP|^_S{HvHFRKsxflkBLEG*=Y8Wf~j>JDp~36}lS& zmV6tf0@1+u)9q&S+&%wMQYxYX;Zx$TUaP2~~ z!{t!$w03!P5IUc=DzAH_86EEjoIiGbpICu<^4$~TAfL6?>21~b^|HzB8f`$iZk3Rc zM3KhW{{=})V)NSFDhjScl1CRr<`5xV)8Uf^jQ0xVGIA4vjIGWn#V~xp7X&0jU=fc$1xg$NTV8Msp&>J)^A}Iq%$zEh(TsZ%17H_6FY?{gpBlv)V2aT#p;WL zoNQIK0oou;e%_iHA7RsSJ7n!6?VjG!T0b7zM=v1>g}+oq)KDu{VP*HvCiiTn9y7w{ zb$`lMjT*-^mX~%Ey@LcPmbj=;O}lQ2!`Ubc-5zgv5Rn#8=YOyLsem`!{#GUw@Ry6c zN-WO8|EGa84J0ay`BmGiZ@emP0y+LKk|^q5qIOflG@`}dXw2n(GKkFL1&WxGEhThS zeo<(W+?JCi`qg;;p5aqMTmV3`2__fzXU6_p%%|{@GZDpE{b{7`1wC8nwsw4 zyrahtExKdH81HmO>d=9F5aqNrJ(XMN#bECp1UnwYu-8TfVu zcX~wQXX%=`x*}_FeK!P;Q8~(%vj2f}0s5PGSL?eM9aGbP7W|)dS=!GLLRJ7r_)+ar z5kolDIqRpA`S|Bc=cnBpW9Ks_;KP1C8^L7gyhU29)H&Q}_l!3gwg>ku!5ctIapyZq z93mfWtzKyvU^ZN`bUmjt4o!IA{!tDqF1C;(5aNE)hoDgBYmfbcPlN$wu6fvVUTV6s`N7c`(;6+kYw%yRg#VK`m z=!Z@T&Rbd}tGIoW)4(8M@6#frptKqrp8ydewgeLZ`vqp6@#|W%B@Mm2n1Q2`+%wPG ze8f*3t>s|;lIkV7Y{E>CrHr{0@yljLtvR}gui_RBv9XlIJC$rG>%y%ssDEq@a<(?k z+{+qGjwCNxb%li0@4fx&!9i4Q0)Mt^)9}LuKQ@tX=JPJTS4*qk6doxg$Ad-$bJ(zI zhTw%mgRO`b$_OQM^d|)M*N)z2LxW#|^IQ(&q*>+6`So}Oija(-q@$cKA_39AGG8Bua6KY;QNTDsRQ31rQv*rjRMC2&N$0YtCLG zgHiiGYUv$Ix=e4vVTgzH%P17Wg5uB0HxKPP9=%-}FXJ9P^$A%Ne#$4OWbLjk-|~L; zGu{+1`X+F0zL7hW28N-9 z_^`aPV(e=dy!o7A7yA!x^L4_NYP82`u_tIFXj0`n^{r!s!9;k^PF zJykB>_PZ&+F)O~^O2n;TwHS_o*J5hc=T-3AUFZ96%c+8SiK0PNDT!RRoF0d!`cY3F z812t93hXSm*rbjZ6D;|R#|X+@y{25MBSII8h7&saiP>{_;G|SnPafnFk6mzk4rjbw zhPkY1ZQoaFi|oerue*Bhd_s`R;_mHycKt*z_*2Ivn8!Ch6Uyq7Z$Jx7otj+k@v^j= zdrnqpfNjRc_gj)i#fWw%$yochCkMb;rJ=2zzkHW=s#!ZQw@2oH5j@-uo81kobHFw; zwJ*Y4?=ddE2-m$g$3`iiwUY#3|MAoC*(}-Zys&jS6V)(TYikJvd?GkE-Tc?f>6Ov` z%(s2KoDvY6-46P`3Fy}ytbXoyq70IBYva?LqZb4?%~{=Fvtm-qV^c6Kf{MGiIW9KM zY<;3k^SU1%kgQ5eVGD}p74gQo2Qa{OmngH~2)jA~uc}|j$V@8TZ)>1QzRx#x*JpXG zvKS(eB5JB5ofrO>Llq2?y2p808QJMfa|2+ED2Wx#IDP8uzB?#j$~1%`genTBsgdfq8hZG2j<&D5bU?pf-STJyqn)R&PZ{=(2zoY~UsLrIDq$q@TwW4e8_6p&luhQ^WGV zaIEcWX|j4eNiV>RS6vZ^bEJei`4|ck&Y^xfU%$f*eJ|5%vN}g^xvj~a zhNJy#9B+I>XC9TJ-r@iDmh_@IXNbN{7* zOKZc?vdGddBP(`P&nX@ZbJg?B;PiQMZDPq=FLO_gvd?^_Cs06}EuIgJ#bYUUI6a_W zaB+S17tl4d+^{2SC!#B)gRgvKO_eJZEM)Co@V7a@#zy_3?tU;Q38HowfQ&BA#p;)F zMeBGy^qnvQN;P!Gwg8TgW)-2WGO{TAF?s?s50@Cm&WHM#8~Acs8XKWt1FwqT%)mms zlAuxd(m3OOvW+|-Hwy744?ijwYj7{Hkys@s8BFc=(0sVGyu7_ot~F;_AFR{rr2J1v zYZ6aON5{zdo*@R0oQ}sbW~Wx3f4g<_oyhko7&x=KzX*ITPquwmgQKwtsh>n6(25HX zDGnKl-(B~c-tZ4Yz4P=o#Xg`8_bVTVN#}Eo8V-evpcYQDqYfv~;mR!%!zcjy6JBCN z8A%M&~C3*h- zy*@HpT3SRH;phigWbfk0N4`jFIH7IjfJEl^ww~|pPfAi*mLUE@6eJb8p4csOs=<_g z>cqk{5h<3rsPnS#NvJ6giheYee$_ZMW=txf#dPHpWIV_m;5C7*zG2o4)!IhU_7RDZ zFLKx)-St?js z6rVLB*?k;P^I5SzttE<4W>_a@$^3G+UOyjw4?fD%>Skcmp>e0yS;|iGUGL@P<&5eJ zmM!BFpa8L^sf$la&7Iol`}@1YnWsi#S!H<~88s_wE$@<7*PaMW1VxNrsA?MWhA%NL zk~Drt!~427w8p?J@W@3Nf)d=m=P^h4-Hk~Ef#N^gg;4sd3%hAV6-&_zi4b@V%~6pG zHOCLJ0bXW4Z_n}4gG|Bqy7)DJN386`2?JgnNqnQ>L$Oi7nfe&SiB z=p-NZg`#WwJk}%?fx}}vMv11))zlUN)MlmE{^;4od2LI>L1)wtUBXtD9!V9vN_+zP z^Z@ker4;4-x2#F-)JW(827n`bi$)$04K)|#Q7%}xTg&kJ&JYtz<}gydOZoZd;v|bs zoiw0qA=QiN2hFFfsDv-KlxXd;5LKY^j9oMZ#dLxx!1?k&ShcyS*~?ztuUfq?tj5@_ zuX1u5$&sQ?*Z-*u-mh*4kv&A{1y6B=Y|Sc8%*a5RB^{`zr~cTYDl_){In{_pZai8^^nTkO@nUAwtEzZn%Jw6 z@1)OO{c8@L5o>M$o6d?2RIX$yj24Fu7gF#&iYOLKTrE(ckUf=_o{r9bdxz^FDJexq z{b0r@`gUn~cCYnuxz#meNLBrCd~6^9hJC3}Y_UP%+DRM<#3}_s^4BwZ5BhnU%?NMN z>oRx04RfNKMmbPtA5OsWe_8-pvA-=>KM+U;StF?w5pN=1M1qS0MeB(6M*4=o)PE?e+^PaW1qe3@j| z-v6;dw7^xvYn02{-Tm>U^zkAmUj(XrX=#pb3;5*sx32!K0`L`SBS!1Q2y*EO^&P66 zjdhjOax9?#r*pknqrf*7Ot}1v?S?QZA0*PSYLjzrgV`Utwc>@4lnMx7HIriz5Wo*3 z1Jj1&1soS^{3|r2lD5N@nu!k#1k##AKh^yD1*p^mW&!Q6Xbd{#wM2M$Z>fbAka3s( zb011YHJA3BQ%<4pu7^O+?L=~i%m5&YY%}#j%ZOI_82m?T^paqzjz^5n0i8>@4c#2< zn=}y%ubydH3tk4r>MM^dWN&4&_1$w=DCTL{{ggI38RvEw_srj+`a-q>KEO^)$x7)x zO5cwg#6ffl>m@RA#V2PEjKMiw>`%C7WSFcv>|1n6)jH`GY<}0I&(&93ue&eoa0?0GW2h7w z{p`Utr_-qf3Q0xB(ooHB9e4AUig>`KMLy{ScxJk}fOKS)0xsU8Ao}`(4PeJH50V8% zFna;)Ca>#)By}wqGJ7keqm$ZRlVJHvUIsL44@`nl&^^0TlT7fSnG{f)TF zg)|67WFkiDOH6JNqEKK?wM(BODvXC!fY{L&c7^FaKQ?8GCvsHf1x4J-_=-l&bZ*bY zK_btHaBPN}y1JphJIF|vw4&);UFnb#hW6eJCf^&p?^YRwN=NYMa+cWfI1?>Z)6Ct; za$9(jpiExE9@Yb4Z1Of+i6}v5!Tcj4kFB$!ZbzdnHwmp+gM;JgF)b@v?dCTQ>BCHr zg$xUU+|SCzb6Tkw6I-^{GC@h)IXN6x$U9!kD%d`qONUT5y{$|X&M`iZ8U6b+eu^Fwr$&PY)mF>oHW+A{|DdM%-LLX?fqgs zYu&3F*C?idR;I3bF6z&Omv%X3pw|W|a>e#93UjoTC~GRe0g5jiBltti22nglQf}Op zl_r+AxI=~#kM*zD28d1t^KxtM)#$}(L~kcyLI?UE10+tMLFiijp3v&${wJ-9$ijw? zh2VfL2g66qkG_Ok{V@mbez)*(yJ$S`)YdO@pR z`aBMVj$ir9u5F8q;wC-xds#bfy(ThoK@XKd?r(7zrm_;jrje}#xcuqjl z+9|Q)8BfD*=ilQ&j67%C18y=;Q1|WQNB+44EMf}G85xU;atCB^De-_0U%|HlGagaA zhHVDad(Ij&3_MviM&NiXGlCfuy?)BW7~3->I=S#;g<=9F0wW~+43Twc0Q7sDm%c!X z@KGC9w8!PfV*Nt!v28D2ol?<>^Rr zt=bSDxiAb2MyTp~-QuMxW}Dd=CS;sySxLue*MzFVG1Vj#XM+CXYq>{_YgMNVu$4pd zv(!@N-7%3*P^>L2Tx^jg+ zf{X^SGKUgE2u<xvjjI?w~sUCw5=7*+aI&} z6w_%Sp}7AGrcFqu6K@S2w_9IUF1c7cy;SRbC7BGX{VPMGzD<(2COy_fQI@mjL@0|% z6^YRg0TmDx(S9cY-tm@yH>`1HDtF^?qujiyFiQB(!|@6a@Ll%wJ^Jn_4es-cP~TAR ziSBUuQKMH#{f2SpeBL{H?RL1pC)s&{z1UXcl(M--QLuW-ZW{PFpzs|InT009Qt=oa z66^``eQz_{DQtTku_OPvS)KLOqU z{)so~J!bOyujY3uA7lrA17<>+~(fVKc$H0bdALQd8(n9u!bNa&4I$m33) z^J?2%cg0YqL>{)ohyqSIo(8Ujt2n~EA%!)GhH{W>fzm=>TE@FHCf*Qp%c6x=+xBmR z1P3MC45tRKjNZHy)`eYGX#LWVAF8)9EG#OBY# zbhnp~OcTmlLFD!-JkT-J73WQSgug39c9_imoEKkED!fx8)T}(f>VRXtZq&q{;2ndN z8#L9#9)cU8NrG05GT)mqTHaMd;4rLBNDb-xr~Y)L$qK_qd&8XD`Uh4LiuWm+m&$9! zo?6IP+14XP$*7vp(}|7FxbKt_K3H<8og@EKR)pts?1lxofPU|_Dkfo4Id?YQ{X>5F zhm4FDH>zp9zP)YgZ5`EQJ_le9D*h_Tmz`yrHBHnD9Rv|@bv*qOSIFg_IG<+ReZF)D zzEatB-yuu58G+dL6joutjMP1}&Yu+K&Nl0R2uA62NEP3 zhQDuSF~46o7Hx?m1d?8uRi&ffqzVO8M11$hhV|P5P)a{1^vJmD{qC*$U*R3(sTi}W zBIQ?z*{@LviNZ}tJnD1p_{KBj7a5#dzw%>>*cQ#qS_ydJ)J2NcNf{RUmW=L?nKTnF zCEL3CKLm00LZh}u>dgvi&oYmu5ozYK58oemN@(#JzcKBH|_&8^iW-| zVdX1t?2Rf1&|0Zr<9X3}+I?}0o6f=%DKoRI=um-B7`|yv*5D>~GcyZLr`BYVS0y_L z@u{F9SaJD`mUfS8UP%^zZ5SN>0~TTsRc8+J3*2}7Ukkfe1;OyK*REo%RTUau@a(W?9{U4W1BCx)=4mx!2pGE|^?Ljq>4shVUNg8W^y%~GEzF+k`?r{gOg!v1} z9|ovK$_0X4|H#DrQ}61#+9dmS5#CdzZ!1P7{40O&TfowmnArR0k@P-`{x969W8X*g z7C14#m!ELFDDB)IG73G-Rw79XEuHA}e2ayRo%&~X(XI^$HygOQg)+)owq?yrRemh2 zoqX=!reZ-iZSx>My0f?v!PE8>)c$3TUCEVbnkZqIW5xYfQHf4w`XkGXM>nG5J5Ap+OFiIu>`1TK!>sWhO( z>Z9Ed!M^$YP>kd7eb;Qdey0fWEp)Ep2_p9H_Fgm(lu~%@n@k^U8Ec+G z73ofr20Vj$%yRBn+B$#7XK;wC9VItpZB)>lSfPDH9`{amjc%``!7{@L6_iN4Y02p_ zs%ca;cySfhp%{elkb0JoHDk)n@DJWpI&ng9xg>S5mm4b}>S7dAAT-UK6MO{OS4GgEDwpATV?ZV%lEEe!ScQ&0cIWe)~pN zy#J13*Wmbu%VoEf-x?nQWeucJ_<-dy11nLWFXlefje$o0gjMGNwg~T%$l>#bB6?-I zuDafBA9GX|`8{4{4cDUXMuvP5^N?zGJvUyr*YpNf)#ErB7$wlp_#fv5dhI9GF~%fnDm>VUh`$ z@+*qDW*5VBwfHg1MfEi#t3XX!@$%c*=ULt&L5yWFp0DwVdTeI!wCpH2krB?QOo<*_ zH1gV8Lp2757U#FW*^=Z*=KKJY`a)oJz;xD0XJ+iAy2oh)R9b6PU=!(O_g^xGsBg9U zTYJ-!h!sR&7+WU~A zb?WG7RF#fuu3kurZ7Qb_DCw1+M=Y(hNAv4jpx;qW7X00-cNeBJL%>!g!=!S)=SzPp z+@jokL0{Jh=tG#f5pDeuJ6I{{gHiB;Dpe{2q+A?BZK{4V|9ZuC{x~!&P0g1>+9yNcV(h>^p#e6FZ*m~{7sPy~lF|9~Q3nT6;?_x~d)?G}8% z{hHb>K|65wGp~$qwZwuG=w1kEt)yy0<%`wwNn>y{tE z&=Ra99U2cOUPOe=mJ*C0PT4R|VIbEXZtR=FN*Hqz7wW>B^WQ`r63O;U{BjBtO)Lqx zo@-AN4D}jEykOTX#e25|Mh`P77JiN1;O?$+s6cXo9B!^>#qG8FS3ajpF@&Gb#L_Z4 zPG*T#Id|4+1~54swa5quj6g$kbzqknPbKbbS6$wQX+;75$e51o`2n}~ML4{e43JS< zON4v1No9{z1+#}$8Q4>Q&-ah27(3=kC3V8yq@exV{MGf|4#ltc7p`^gmRLNZcuL|J zQ%wzAf{k!J%$^z)J`s|bXx>Zo3=f}uawT<;6lICnrgSPxdv!)UD^2*B#X_@cQ$gHB z_78Vdnb7(cltmdj^lYTAKhou1-tJ)~NgP_04ic*BUyCW#wSFuX!)fJ)D!FFY282VG zUWT(XY&DyZUB6@PAjlYx6F~O_eR*heFP~yTx0rEZ?kwFs3)xS0%c>d6V-^yctKU6# za1XQMHsC&QYHOQ0dI!pf)3_baafO}+PyoJ90UOtxgW7&~el@#F=5M{rd(VewhPS0- z!Kr%paeM!>$2G5~a9yec!FZ`wk}YtM`>q)`Q$=(E%O>dbxb9|A=EBtfqzOS4(-+!6d8t1?~UXDewW6g}mvdfEZqDxX6 z*KkN@Uhm81fj91PfLhY(>O6y1zBxJXR7QErmQ6~_!MM981pgM)K#8gt*VLi+o(gGH zQfus+FPN>@sM!}PV%4=OQW?RtkaB0fm%DwE31#V>67UwSPQSe0Unv{Hoq?yt%07)< z`H8WJFbx;Q^rBv2*leSnA)LG;N*y#y@Q13RDj}qhi6OYQVMXaDl^=Vd1wM9Kr`j@X z4M#;9izYtE2DZCx@uN?*%Gn3BL8qaU`*Mvo$b$&Cfm`e_uZ9y23ok+!rpArgg0#Fl zyP1!~6R-kmnP_ArJ`;gm$BlBr%Ch&1+x2*Y10?q-cGWr3&MH%UH=7+kOo#=IuKrH= z=n_ri?;>)d?ab(TYf@^7q2Xa!E+tTg>J@(|%35Lv%m+;nlqQtZ$P+l34Ra+cu!UC7hY&b-G7~XWy@Pvg{r1a@rDRS#?a#eQwi--UYHN zl+kbb$x`rS4!8+Px<81Bw?5L#>ij}+{QpK(lL$@B3X`ZVM@t$DcDqJ>IP~A2t)AYG zL0lCNEM+?J7cw#|P=c2G?!?Wy^ga&zp3=5DeEHN4(QHMS&V!ry&AIVEGH8!z=*V_n z6(QgjDGPSboUe8SW^)9lXi&Z+`QEyYuJ@;7l5KDlNCJ4_Tz?S$Pa)@+krWOMt`*Bx zGmBO;y2fm?D(QKfw~z}2e@F01-W{w~TYM`CqBm&OaRl=wI*ZbBjY+~U))hIW821=g z%&ZL)Xe`sz%{F#FW2rG4fVtW>05UITRU-o+GIQVx(c`{rcsGQ?{d7RqTU%i@H15^< zLSf~9An3l5Zyi%>{a0I+KwdqrVu~yzID>s)m1AXTX*9TQW;4Ep8QJUAd+p}GGRbk~ zGekc+>v)giuoi`&x^9nL47~`vbJA?UPsD5yMb?)$3l;xqLQcNcSlV~l~p<{#TB;Q>h1mXa8S=+K93@n_& z%9SPFX>YZqmtvI$TdFlYekf%wWU}n}J;Vi_WQT%!4zH!9gLKfKa{~Fndvb6?>r?m4 zOGQ)p|CBaVUs7r3#%j_DR8%Y9@*O@O<6b z#?G#>scGu=7CmTyv|Fgbd@t=ItZ%OByMOHGb&dZRivBB8Eg=gp|3OgJRbf>krFys; zSyKK`32ZXTvhAd(0KW5C&!gwv{i;^F{$9q}YDH1g`$0t#5Kjf@!KaU3x4QiEhTe&D zX8G0CfweSB1`BxFZ3u;C0bp>4@2l~H+haT{z9yJSNLF>y$w%xHbze0Y^+wF=KYuk< zYPIXdm?@Uy*&Ji%yPafimV__WD0Cq|Rvof=yi@D^-p_QqokBWB#AEY#XBH-bs_raG zxMe@!cB(?}w>75k<)2Ck$CksSy-G-YxtNjYXkJwq3wNHTB^tvEAb44EzK$s z2>7AmX~x9c1Wk?1iV0lxW>Se%%^OG$l@NC56^=|+9%S^1Caf!ovXh;I1X0Na4V$M3d1lDVv`nU(GmEvxhv6!I&{^5y#*8AqQhWvfctvF$ z@*aB`<-N$zlG}p>i-ppt$xn#wgS|PpgvL&r$~?h0U+8O;GekNg?mi|WtCfV0j6<@& zvjTe)?XDk=o;s!0qy>K|hc#Zz=#q94Lr5*XoVrtc*N|KS^CDw=A5XOFJp_A)KWcMr zMh0hA)?;~9CixU@>}c}J?Oz=I!_z6nyPhkbFdZ(tebyT5ku@dfj|e>HF9 zawH0NM>J8<)M(-{W2n7TOgYi%CA7nSH*%5Xv&K|;)anaPlwdeN%`?raY5w37w*6A% zy#P)e`lj$Aygtk6=-%pG;L%@$;_Q+*8wI9?$S-k7d7APx?h>{-p``|ZDzv$ z#0n(4V3Wf(mKLc*BuLT#H7jsV*v+WoD6(+ z^#o>lvB)7_<@^sXGy~6-kXlZN4gB!?J8^Q$BfP;CDICJSQ7w~Hmag{E%M}Qi9sxv7 z%1K+K$uW2)sgS)luduo7Jeo(*=-=AKOM;iwG$Bb+iDKkIfzasDb;dPf}uhXNv|$>2!ERyV0geo~k2|FCX7P#bjzp{;_sn4bJ# z3u|RmoA1bUzS3q4hmr=6!cj)z9{ke#>ty7cl953efV>i&KPm5SgJBiKawF1gn3lz0 zF$+|TI+-v}mM+JHTi2-~5JnSL9487S#Ku$|z_n`mBLtBP*tH=FenkP7h#NqW}tXS(u3XN8* znkDYn_5bWBkK~fr#iejg&;Wx*J58YwGNstkEHZ05nJMFHHc4oH<1NYKt%SW==*;89_e2N-4Tiw} zFQqiPlhJT$K*R&{dIv1@csLteS0UpZpo+liSY^bQ(!FkO@^^Z}C=*nNOd_;OQkj;6 z;EXu@yuwg3;L)&%HcUHb2+hwbeDgWKswwn3MAy6%uly{?vtOcUpkjsiK1kc1)BjV* zI~T(l&TDDNBjSd|`oxHm%n!CiNfT_WEffv9pbRIBfT>Um2orQI4Kr4Ec*cmcD2P(x z8)Oj0bQioXu)(#oz7SEUtz>S1;FoQ}?G4FzK=dq< zPCUk(;fyiMDjWykvh11P)G{g521D*}XeB8GJN!|wf>u|&tJ6Galvzh4D$Om~=lEY4 zk)`dKOV@LS>BXJRQe_AxJE^5vE6Z(A^yaFdaC9;B%N6!VwWSxcF{)%~ z;k03#bGRHP-*$tT-Rq&8VNHZl57O zD_=CSyB6;|JKMJDxaw_&7QVOw1v*DDq9(dtiqEsPkZjlZ^W5hR%HTdtB5cvUsztVI zY=#|93XX;ODU%B=!%({uCVj~+K|Cehir1uL|66Pe=mY$16mr@jIy2c}jChz`eqMs2 zB%hCKY<7pKs%onHtpjJh(?756*C#PuETg>R&Yo|0Fj~U;EHC5Nlu)vyCJ0ds$OSiT zLlSOBNymzLi~b7~JJz>V4rheBYCD_yrmm>FKUN%~N$&q-@h~Q7Ofnr0C$aoqSN(Iq zGz!;~vU!I^aYFm=kAen&u8PhgH7Jbj*%23gtgq>RL-wEyVUdN48K4bbuaKu089F8` zmMJzhwhoRqAf;mC@c4uHo0{~naei`pKA-~=3^QdVbu3H#;?RqlvGa4gCV=lSy1~+T zPSe%(62YiBfV7)mFq1q1Ho90bDSk1zcu3N{hHJi*maM%etD_a*KGWP>GcdD@mF(K| zFqVRH$>a&^5%vLzp0Fp7bC<;o5QtL9P9(9%GnZuIZ=qAs#UPcSLH!kNBEyx&`(Y!p z7h~9vayJ;lp`xR@LQR-gJ#waWY?qThc$=)Y$QLmtmie2{NJ@arK_UBqY@Xml2u#R? z?JAREpqu^{(kC(kc0CZGf-9{&MF}frV{5o1D0bJZLBn|9Z#bmcAXuPm9$T7K#TT8Q zu81DdnF&b(qO~1Td@ywk+40qwAf6@dF}Nhe0wCs5NspRHiA1e_0XfBgQ;K%Fi_B7{U||I(+#?b}Gfjz1Z*g&5_ACzh3xtbmBVtJb{YY zFU2VTNgCBUpr35>oXnq3gVjVfrY*~$=_iz(#1g)i_Wr?=uB3&bnpMjd>`-W1jL5^8 z+WCN(UH{Ly+Im!d0;pC_%lfIQtGj=mvFP(OL}C#7#f-0JFN2MPRoan!hf&lKgAy4e z!au3)-JIoB*kO?v82*8ZPB;owr2F-^`Q7c_GJHPy8@4W+T-8egltdNWpUcUO`H6_O zNM&=mRPri2PakLeuWxKXCXJ{5{3`|KA4aFhLNuM^zcjsqnJF|_8+i(4%xiWJF;C!R9(sAp`cvO80%f;P z_%EYn;(}75h)48)X=Q3Fzhh|TEX2nbgT>Ip|HJ529R|c+{9s4piCZZ9D(+5{mxNn~ z`@yd?I9bsT#Kvb1Kl41QvSGWDPs6$WxM>iQ!OO2+n2%Hr70Jqf5KP z-{OZAx-`i_g{PdlmFRIs?tPMl@QK9%fES+F(CCaUpok<^naK^4*NP3ajdRi|;x(jt z9Cx!cA+Ev&ucl$lq99-3>8EW&0IwBvK^E*0g9NkLNen6(6rZlY$(IV0AA(NTOYQ$y zp}vZFnQqm|_P&ulDGou?ddf%&=9g8rv?vmE1+ji!`|Fwc+o$cm*X)8`cb_r3D<;&h zf1ggW2yz#<=B8ZoS2rtXyN4rbLUTL9xLdR-K$cD7Y|j_Sb}*bw zf2(io9PHt9_i*?m1|%UPcH)F7L}S9C`EW0lUj&MLTB#uck_l{FT#{{@hL(o88bu*6 zfK7XD<>7xON00is`?K$j3s%NHKQt8E&D^j2rh(BZ!P%JBCbvY{=3(96 zgty^g<`RqMOm1tsDS9K@I8uWo#)aZgt3>OUB_k@ac3C`G{3c&fV~@WZ9JN~>VUNFF z1$Ve3DGN3&m>=jAbgF-A|155RsZA(jPbBU3HZOhVBJoBx#Wwg@fgw(y19)W4awh2~9CBiae2)2JZ)2h8k;Ocub4xl`I~O zk1!6U+vl?-p@dj>cx%CFgHWZkL}<&sYp8debaO=dFFbd1Vr%x)H5p_1HKcJ|e9p`$ z^VALxD>Oq%4;(nCUq;>0NMj({@B1bSUOX|(^18B9uPG5ryX$ zcNe?Qu9sUqb2z;>QPWI$Ciwyy@Yw*aCJ1hsmsfU7lg~5t5M0*&vd`i7lp_Q>(h(Yt zVPFz+N25TP%@G{B{R`g_4Ei7r(|KIm+%{E9NiH=5R_X8lhX_CjKVfWh6DW@g1B%mX z{U3O@pQ+s39-j`9B>&rbelou8-ut_3z0@hOnpsjprDD&swn-tYW}pZvBBmOqwL@;F@U)hH#v(}JLZM1UWs8gb3qi~u)~_cr#~4@`a=nT6&+^(MMMi#^d8(H-Yy z)dp?cV;9Tju1_w!dJ3;)j!IS04Wx@|KqF`=kFI1UJ~&`0vi0vw8f9zc{p zPwdB4eb@5Z&xrnSHM?aQTp296R%&F~NOEVxiKw&tGZHeQ5(g0|jMwaN$$<;pUf@g@ ze&pqwS%WI44cCI}Y+cJH_9W45gpLZ_Iu@2=PWf)diYzA?@W0$}^4QvQ8mWB2BSLYL z(6D|BbT?gcD9IoPJBQ)IiSS^!bliZdqMx$VO4AM(%ir(buiok6IE6%L;Utn|t`#J+ zqb0pzRLGjiVum+3*E+ zsss+q)uT(M(nSd&+j5EV#XRMRdE7R7w;$G@a4Fb6&sU!mks2_Gm<8mkvZ(mJ;Es;@rswA7Z8+v# zXD(+sWf`Vyc6$D|BAI$7?0gV|D}mXh=h;OY5LyMjnEx_iCcOE0C2@Gz@|?}?`OO(i ziQooJ2mL?WW{s`JDyOF2cK+gX)uz_FSZT2Tk$!qG!XNyYiZeyWVWF6%`%j@SSN!c%CRDj z5T6HG#_=1L7L7t-+AE=~EoldE^tq=tY+&;=Qjoo-OMu;7uzAL_nxZ*z{$%ngesbcQ~H+*7{>y+WcEP zrjOUmy{(|LD&A&v&xGGHj_M;Xx={?r8bM~JqaM~@ASH_n{8@-&1{9G>LC@nB%4kw4 z3 z8iaqleMRC9fjG_URLe;Y)f#r1pI$h*Dre_VYAwA?+SF$KN7!|y&3b#HIquP5hx zG9=2T>N%&Uzt^`nhpIq_g^7lOBOUcr&wghS$1(73^Kf#;I)1#V7HiD{RPG=k4VSvr z>xp6R+U^bldr$v+N2-8!UwS$4X+B%4z}zo1{{t#RST*5gG{VY_gn}<%WzzEu<>hpp z5}UValUDoT7bRvGV+IJM?{Riy7{WVtg)JosA@L0@9Do!}ywx`*S2aNsN9=I60;Ajc z50g(P?|KyF7mX~I`E1VN(&?g!=d1y<2{*p;`7m5&4d;qyZLdR)hBb9-A73N8AvFCIS8|l5#Pu){(~CW4h#5wUqH7>`Ue^LE0%cIRF(cazIkr%^vKlQe2%`^ zRsGzo9|;(GLl#lk21kW8Y2XfLB_nGBbtgE!A+5kq+LSEd%GHMm+R-^$X2B9gGGA~h z*_4QWHf4}UScrEjNp0SWLkc}atgr>nK@2N8g`9P=`|QPSgj*s? zRcacc2OVe=G*TM6w9mEqy>dMV*}oIN`^Ba8UegP`&gk!(_uf2uUN+S!xg2v7#^I%8 z7S0#aW+K8EBcr^YYz(8vWp1pU&Y4$_WjYk+iFInZVFhW`cH)zkBKV!JxGmD|a zA-iI}t&fK26}HBz@L7H7g7IY%xFe(o_}4QIH9MJiM+4N=2A@KH?h} z5J!zA)bYO0COQ#*db6APf0ANOYD*?kHgDSUUQqMt=v@ zbu-xL_(FLXB@0_;F+0o3$EE1*7XXaUv@bYkG}7rGzf!Ek5t-|T*w`kP{(JQW(zh1u zI@$cbnf%`^nm39qv44LhABQN#Z|G~2Z4wx|Nh&MN3HPtUsiqlPu*`%es#+;HlMg=) z7ABT*phsA#8@-!6&mZTrtk;gIWhhKs`y zGp8_ge2qmF{_sXMG{{SZ_I5JwBSSVfal)=(FpOjD+n}yd^zq~Wq6sh|;Mr_}8ygQA zBA!{-niX;l=wxIWUAUYE`ca^3`<__8`#hM|>UK>!ujYadCJ~zo$(_}^hhQLjD*x`0 zM17DFpnVT$BjHzE3C>&fj#G-HL<)fu2_{k_&GxFUEzRMbg?{YiG@Qgm)iJC5aYgrr_mPK;c_nG8BI0O^-1oL?(v=5y4cAM%Q z6Ss%BE7(J~bBKzAXQvTWq`tnBb#=W0yf*gOhSp@){gJ+kv+F}#_ z+CSQhHf@@}^bTi_1c>b~;;AjqT~KMsltjq85nvCVwwmGAuB6YRG30j7EGxpYlJ_Kd zrPP{{n7iuxUn0QKQ)uBuX2nCl@*d6+U3rdIFcs*(UUweXx4Kb88arDD78dY5=S9LP4>-{ZF27?X zFNXtI+fHW$z5<7kITcyP(H9CY{A_H{qb>gm z9F|l%J=_?otVkkGcArCTn$RbD-P_U>zwZqlWqntZtlo05bYxTRLNH42Fz8=;VM0-{ zXeOB_I(_e|8A12UKSx%p%1S7E2qFI1Q~a;4MKztFXwp06(YxlO}Ms7QrbD5oPg|8 z;Y{;K$Nf~OQ>jvprn86(AH^TZ55V8@FioJ6jg*c+iw7)b&Q37U9fj&uc~6Oryif zJ)lOD#vQ_Ht%=5orSrR}SzWF;Hk-2jkLW4D*W|<5jm`a2nBS?yQycED(LT>VpUTE5 z!D*j2pQF#m`UduD4Q=i}5-2e(Cue7wcD#?eoY^A*f`F)fhm(5ImpL zel3?2I)sLKPE7t#d=KF&7TevO%h6HC=QUbbk6-mAd`?CLqVhK!tt%#EeQKXpY4-<{ zg4?8cAAUGqF(8YACdVi1ZI`=vJPYbZ`MR(nRv1dAh~*8)N$$rKg5CFIiu(U!1~@hc ztk|TL9AX_EA6s&6VtRg|!)SKIjKLn`1VGwzj4_21Aqa{$=gvQQJZ}kW++ePj)bcPO zi*FIX0#~PVHoi?$S6hln4*&PKzSOJAU*O~of8PdE`Z?qM;$t0!$Ev!?|1R@ z)UC_sz3=sF;rzknI}A6Jc;bQuHt;usyNwMU1FDtl0cRvZtn^*BLR*w%{sJRmO%2Tq zTX$PAlQ^t!)na6Mp1}kAC=2dCJS0&W10W{Q>X;3@QuKXy_Mb>Wje|G^JF~J%j`ufc zxwIzrg~2Ol6uUcW@ENh66rIbXC$T6)gomoZ^0-K$KVp)!Xsd9M@klP&Hl;l8OK^Zs z4$qTpCgK?1=r!VqjDhB_^$fg7GrsT#s|A&d(v?DX`E~~ozbCeWu(q`fhQp3WSS>>} zCZd~n^b`xAvjE!SM?;3j=gfD_B(P!8`VYDYeEQ1DY)-hYaeVj^$PZQA=m}^+zzxCT z^FuQ%T#F7gq&Leu_qNaay_a?D_}4T441XDuY;!Fh67rwJa7Qhca>k&6^qv|?K%$yp zlV*K`lE~ur$E09&v??on&#(RKkQ>*s#mc0H8n{fJDx>ffmi0Cy+g-J{^G*`-+$8e^ zEW)uqFit`TpALIN%+=$p_!SG-ph&iT!T`!8@3uJa9YrP^(XB)h|6IDY`BulxS9SX= zEvyzcZ?#V>>|}0`Z{fqvaQRnefld(vHR0<>OTDjSE~$xB^al0dB{_Jn07U{Y|cs^bv|E$-nx@zSr zA{BvexG@z*8B`{fE`mRsw+F_cFDAkj$&<>x$Fv;+r58u^6m3ZrF{=+;2e?WgMPHsq~xp9LdK4ONk-0urPtl zraN}NCPo)?y0({dpEtpp;UaSDoeff-DQ@O;ht`%Ah;wsWAN~Dj>dO-o%(7w`2WqkU zV)$}%I#M)HM=|}=GVq2Qf5b?IiU+TlfrtLB>PU*h?R*YAu64Pm9c@@nQ^qrZ9wbTr zoDn%4ZSmOkK0=6h$y?jSvQMOEDA?O)kJ|WsZ!<3>*8mYjh(F!`4*&@FR+&n{teYqyDd-@%Uy1 zTUy)U^i;OG`eO!gF;gI{1pi*ov@A-Fu9?0GNo)||>zz=P@bq(mH_wj14v;F1K2W5h zQlToR>_4xDs9?3Sc91aEjj6RNmSbrdsLbZKCO7@>P#TJUs(w&qnQV)}v>%nigdHVP zvy;KtUXNQOI7gFNM*$o2S!{fLj6B=`GiU2$FgCJ;fBOHu0Mc^ti;F_(u8{(O-@6!HF6IV(Vlh9w_SfQoeh|)-mBMlY`G%{)wXi$*l5hqMx*ln(zgk4)>h@XcR^N zxQU>we#1a7M#zYSvCBM1|)ORzCj{iv<6o~#rj2%`9h+sw=MWHzwn zlZNxlE5rY_D$4=|EE5*_DE&v!syQ%1lUP5A200+GpA;iO(Vr3`cyfasE1SDTSPMxx z0{quGP4i^>y3GF{%-hQ6oi!s9BCOPF9zNnaG}(;l&sUZQ2; zp9lwJV-8ost`@DZ*&~xPq@Y|iSP7$_Plh(Dt84DgmjQIy%-!xJ#dFrnDB0v9Fc1TS z(kp9A$9gA}9U7~=8cm0I+z(Q5$S#@GXeHo(rIQ+BTjI76)PThpM%H*SMT+qwBWPPsVI62`%534VBDfbTzJ8r6|yQCrf)MM8aLUILY0BLEL; z{by3-V+Ae2mnHfL&nZ%T$}X+cWHe_?mBo&N zj={jUPAsL=8g)o6QX6QT)J(-%JPa&lvXoIwIL7oG$l85I7J8nKTl4nFWAyW{3W-@6 zF|WwIKuc4~QQ{U1uR$*_j=LKai_mYelDXV{P4;&@ZL1d__30f3u|A zti$zu)M$_2?qlaAd z3=sn7z0Tv3;dq@&uUPlo;&Dx;wD$0o(^jT!CB0TVBRA?v?BHiI{j!7FR3W`6MU`op z+fO>Ev-2;6Gii*no|9AEg#~mtOQqyb&{~BJ^k;EDw!N*Y2Ploy9+YKWSb0_7<;{## zV&ZNQYh2G`hd(W920VGj@r*-Gmxp8W82e`A+sI z3Yxrz5O`EQuj}{^=m(4BuMY`z7VnxbD2H&pn;SeP&C>5j!1C;{ipZclPZbr#zAK^rr?QiO42|=ukLd z?eFa!xR8q_`yN+P)v1KPOUY%CA`-5=9US_N)>(h8A7p*s-kY9X|D3Cs?)wLQW>T9{ z2*7bPXK~))d%7wVgmM%K81y!cn$aRH2(L3~*-oyfaV;|8lgIx4mQX$Tl3HteHSb%! zVw1OS^f@6wi=)JKq897RDP8DVC@cTKs)R)2g}=)F{$mG5ae3+H3D#9rvM)azLH+b|E{rCJ z!t$Jtx7(hlNZ#Pq4f^j^?XO$7b`CaVzbD!LUjT6?j@gXaKRQMk&70r;Hb47|x7dID zkQV8f7t59`v62>KrE^Y;M0~Qb`wU8s$fjGKX!*Nr5TWc>UVRm>4gd51^uKU)bi~Dr z=lR$F?Qe1Qg%?Qj0ceXdDX17a+hs;-L%_xvRfEz>yteUps#IVxn^GPT3vCC3@Cv&35Ql}D?qk=v}wvvw_q*~$IXsiwjuMDMARJAA1 zg$d??R2xFm&{9(`7HALS!JzkThJGs<4cv5?oYQOT6Q-Gq>TPQ}#lLj00Vmmoan2|+ zADPuTCz*v-3uoWQ_t5!3mdf#@b{^#ow((?Earfh!TzlmKpFQ5^=7%>K4>FP@p{gpX zsz#?7gTaWVT977*q%%3k-P^Z#^w}qT^#1$Y{^&!d2m3UOxj+X)V4#3Bk+Feyea>R% zUJgo$V_s>JBqPrfS#Y?958nC-AHVYs=bpRDfAQUa$@AC0LgfP&FF(h3|JA?Z?x&yd z@bkOW^CPP10U>@So(eD3(bjcp?9sLj*|5Om17_utBrVuJcaF)~vphPQ^7^m+IxoHW zGV5!rq**Gtnaa?#V)~EpcyBl_H5NcinvmK$zbl@bJNXLI`YZZ1jLK6K6&q zkFkc(8jKeev2z-*j8`^jss%XDC@;`HV3nq=8%$P21F}#bo5oQtD+#MKma=KYB9Rzu z#KP2dLs?c>V+9k_$PB2{HmMkT+0h&NmM6|So>F6ZAGe@Ulo@3P%Gkam6EUmm?H|(B zIEYc=2FR_(x`4_uLW~FtG2~UUA|qWQwpu5~Y2C|&I!o1Q^SV}2ID2|*w5!N`O~kU! zIh2X08m&(PB(#Web}Wcqb24udHzV zmBIEBl0e%?IEdErun5MI8tJ^+ra?tAg!c`L`JA$<84SlvCaY}koF~h2eo?M3W$%|| z8EKl57di9UjB>G%7;NGUB#JJbliAS5);1vo@;sL(e4I-dW1dY@T2A5v zv$4KTmL(`-FgB46#DEE&#AuwcxZvW}h`8nJ-|VO<(~+_f`kz_ul~aawPJ%Z@_7HH5 zBY4rueere5pV1k{qYfyDPftg(fr@{Q4=$RATOK{Q&*Nh$rgc?Q&gQh`l3|u&ealb2 z|090)-~KMY{!hQngY9+R{_&5|O+(!@z3|mVe`7aW3tt!lnrI>FLS?foV>lR)q^XcL z&4Q{bqwGfJcSb>)81gLP-lwCqeF`c4Y;Pa+;nrSPLfd+ z1BUU5-4&wl_fAVTx}c5|fviSp&=$1zQ8f-0;nsKRSmy&}-I8P?pp@ai9P?DvHiaNQ zKoy6&Au96Q&i)g1p`Cd-D0QM2Lkfu`62&cNw4{q4GIT^0j5bdV^t*>g$Lc>l%jqnJ^v~OEY11_A3rqL+6jVT4MPg;9XjEXBWxW5+J1pi? z5^E%v(nNMz+#u^%X;d_ry0#VJa>r5QR5sujV&pkx&+2FpM3hYkju3q0mOcI79UM?; zB{5^JWjG$OzOnHOU97&;9o83%me!i_WI~?HF>yIx#1BQ+vB*_h<{MVcNb zU!&zI)w&jKHOi)VJ;t?`?H6C;rTrsr{qPUb?GlBjt}0wr$z~}v)NMo4%J!vh9H~v8 zVs;xNH+GUpxM>qpl|`JX`$XPeoO$ZQnj{H%p0ivo@j9T4%(9dUSd54gqiHz=B(cY6 zCMy$$!$G8%niCR6XbH}|K0!1lNIu=l3M7{4#+b&v$lu+oTKy^UBQ%eCCgB3)Q zuj1?R(aipIx7*$Lr(ZL@30StPT1DxG68Xl_!9GWa4F*eM6k2)SefQ_IbS+m{_RdVx)_j>xzPknTp-d>YSr0OXjm#kMdqD7V&3~ z>t-iEXKFOYS{kL8Pmh=#9g&SEGPoy@SS=~q@+M%Dgv8ih-LCo#t;EB5!c*_nfArLW zbX(p>eb=e&V2DENE>i* z2_ZtvxyG94;cE#|d7Y+d?~vD7E==)|a{Y~e%pf#;{NwL)^!O33TFMGsd9(^NuAvEz zJR9QX6^-*$b=7xI{SASNg;Tn|BuONju215PKU;Tn)tWrdNz;`1d@e|jOa}QPi_j6j z9EqlJcCoUy%GTBvS(;%JOE5+d%*zt*OB&y@T+T_elp?o1Euh0!2On9|Jq0!NH@DnW z(Q2f9Jc{bRD-fGd=rKB7u{zyNo*vqF-LUS`g`?pb7a~(EekipjG@j+6M5j5ft@+^Q z2TZ4PzVqgrJbChn!^3@Ed;Om>9v0mD><(F%5Uo!-yVKUL?gW0C!Pa%)-8{{Qz_Ki( z_b2n8Lq9`<|7=d{eQpQc#sM`B1wCW71fJ zQk2oGtgQ4$((YK-wr$UkYTFiT<@i_Eb${gOZtl}FpAPt!WNGw7I)b)%uW=Y!1TE7B z7)~baoIT6N#s*oIp|qk=nlwq6A3nr|lB~#>3^vf#P?vKFjtEYO@tp=s%V5~`I-ZkI zi4zj6#v>^_E(jhaoC?)&p$p46dD5Rg)^tTnHoU4w2BT$`)LD5zusTI%unKfyIGjy6 zIzA#zGS;>>c=-4c4$q~_m$-lb9tZn-3=@NIeGJ7ox#{~O_9+HeFN;+tTTgKmgr1;q zI)2Uv7w4hzwL~CaSy!xWZc?``Rb5dzk5&?$Wwas7GP3BM?TcOacOLCk%7_yEsp1KL z!`xFI9w_31N4j?@R1Hm2GaQXsU0Y{mWwr0*f7z~I=swX}%VcGRK~ZpYe8hY<6TOob zG;-5)xEe`5wl%Z||v2-c#{^(CRo<2sIj3m-iX{&LpwipeEq?x5^8@$)#gCTXAl6y^_n5cr*5i_E(%0SyvmK9}H_Csl6F>#Ug zWwfxd^eOp8kNAy+K4@99D-WS{C)?R5Yv_u`>29GjQwyh1)ZK)Wt|$1G+$b`u@fv1} zB~1XUp{y&OJb6Nv=WLzX=GG^loII3lKzWVswqr4hJe*>tpDa6`4ngTVvN*KwzE(O? z-<$I_P_+%qriLWp`d42eFAC<1B}taEwz|e-Wre&bNYXSSdrX{>x!&OHedrU*IaQp# zI3@_ELn|VmE%=uCY{4`t^^0P_+S&%2Tiaw={`Z<%^Q>U~UA%}iWo>XvYsB`_25??eyTGh!IIdb; zk}_GFFkV|{I3AN`88%5|KBhGRi8MD_p`8S!*50vuG-Z%$26-+bSnp|^qmA<^r6pQE zAo?Tc96?8-s^}_Dfo)xVBAM>r@a70lI7z~Fj=5yMn zhTtPo!_jzw#o1&O2hhTK>eSpQF*a*$FlmbSFgbsjU;plJarVkJ-udC5@>f6nQ&dy3 zGRjD^jHaKVsdyypx~KN3lxyjj+*8Bo)3ct_vlaP$!?LWI*DcGS@iw7Y9iX!TgVC5Y z%gKv^!C*kQ#V(2g$Hxl}_xD(ddL3&F#Js{hFVI?3HNugnOKI_4I!;9syCe}$${a3c zSU-iffez~{$3qu9x=VsNHK*&2h^GrPXz}CfD3=Wj>fIl#E38|D1Se6;NmWWt9zjsRWmOWQS5U{* zVJGafTH%{WBCwje1w+c!8{g#em6teo@fvq-zKd@c>^^xw(*$O<$F~j3vSCmZRCR+! zm_kic3lSkctLv(cKc_me^F-Bq>zo9t`XI*Z5EvAO)TT7r;!H|NGO|1;&j$>Of-Emc ztY$nKkQM`cx*)8rvZPArL>2XK zKI+%H0(mm;l97dTEyu?T>Z(GaSX{4KjpnDx?Z6g59V^%Z1^5Ihq!9VXi$)*5?onK@G=jpE-vrL_aiI8FS~;JIt0doPp=AUSTj8P?a?fsJ$mOnt<&) zz-~?^DC%xADxHrux}RgI4y4#)K~Iik-UpU-jaLchpMQbZUVoj7SFW;o?kwxu+Z3ZQ z#c(8ZQ|Cz%E7+QY1?%hU6nRe5I+O!zQ;BZt_-HXHn1{LIK<&_aXSv1s|?&yfvJ6bGFDoHuR z?G?Uq?lLdG{%xpAru(}b>^FIN9`C*TSKPe$0WF$WUi~`f z&YovuG9+^ge)h+|$JlBTYgjCng6knf>x!fU2N#|qK?vPcgonmhPyrW2N9KbJ>${ND zRBH*ajnlv^vEq4DiY!ef(#$)`s*>$)UPubH)+nR!Uby+)5wvN%6swC@m|S`eOiEK$ zOeQPrY@eZAmSn>rdxwX-_x=Zzb%j^5AP{0l=!u`*EUV|~tCIzb0dzPaeR>~yK7ZrH zI9%5a#c;rLFTBKyH(uq&t6yXL>^X*$RR)t4Y?=wsQGqp@wiWllcs%LlDj=PnH5TuD zuVg=IOg%xLcsPT1XsbzWN|xm$*8YP9K71+fYR(OnpBF(6(l1HC^j=?b;7C2WkpB^zBjktaL4vV8>2BQ&4 zno+e4heuO3wze3rtcXF{TC7b#DL(x0CWGOS^XD)0zZL>0qbZ6ZhewAj7fXx|__k(m zcbE4+yvdzU@1lImzy8gC&h-9Ay!G$?57x#5%Ce+sYqCtt*i~5yi^-p8rMft>xPn02 zgf`MtlQfHib|<3J;ISHfTT|B!AsTwSpwcWaB9p15s@o{sHNsAJGVC`>Ozav>-3AU8 zHES2Iaq-4$40g^k9Ir4)L@b=;1;ImAmVET#hur+|Lv|lMz~FFoNdgp!u)9;Yy>HvYoa70tr zG*wBpEUBxS5L)pp5`^AhOyqqBVQxo#mC~A^tqk08r0J0Di&tryn(@knpkUGpA>sPg zHB=nxhj=vXZlmtsl~$OT6%4ENec#d6Nf^5BS<^Z*u3>E$)8w9y)5o2%5&Vv?x+7Iw0qKA5hRG8CxUr ziqopmZX@xz$ndRG-Bt%1r+1uM?K09W5e9ZX^7r1o!GAKn|H~lQg#k8GbFr=v) z-g*0N_V*s~{I#p`!*3)~{F9r!{gWS19zJIO;XR5ZFvv8^`J4~}MP865mTFn{+O*&$ zUr#)OlD16{If&A__rqChMa|#T5?;}D6%pMmus%guH_^(|b*(4jNFShTT3V$UZESP? z`Iory#;@U%0yJ!HnT;RGoFl@OvV&N0YP}{i}?cGHY{gT_V)ML-P`5( z=$NCUqZ8VM)(nS3#*+yvt80wMV~W9m@nnVZWL3JzNJ?;VGpLP;3VPRfXd%id=&?LL z<`nvgv|>^-`#oOZhvo=4(B;|@|fG7-lnV?E?>EdcP$^i_gAdunomD?n~#6~ zQ{3W+rmoORk)=7qBByEUm~JCSs-~_{u7S|@v1-DPmmOE9aja*miMXO7~x1 zHcb@qni!oH2tm^ZST-#_O*wz%DwkirPBvNN?8VDG**!*K84O3HxhTfdEM+(x^xa-j z3^;fGycoz+@pM|PBkL+%u7#ba61G!h#Z3#sy5JeTfS`fc!Hk&56$ zt;AZ>V~~k1%itjTR{Oy{praW+D~f(_{;W_vD_DOomup*G+ftV`Rk@%kOF2*51f?V; z#(?1kRV|tK&7YL4i|&`Fzgw z_=u*dV`mnaOeSn@pCL^}q!|LIa6ASABZK)Ous&YwF)iGBw z4tXQFl1LsP^z>acBDz#cGo2oDczDFY{vOBEBLbfJY=%;SmtK64ot+()^Epo*Kfzkd za6D!SS~C6?1%q>m6cVtx3}3jyTfQKV%RKAg%xfsRqHvLEm>V%!<931 zJx9~>XMgg?y#MpJd2shrTs0?DOLSY3>p*T5nE_l&8v%yV%_Y zoL5*AAXGA7Zv>HSlZ@6Y8s}-8WIDP4ZLqBGT;zqXyuyVSUS$3JIg;U+Bp+gQ%Agoh zq#3^T+<)|tgXtkzo>63(beWr*uYPISwb7VigjHPf*_xj zl1*hX9CEOKNLkmUS;p>@Cp@_KDYtIj-Wx!(;`6(U{Hcvp8kA{?*rb?agnYih_{k7?Y9M6y@kqEXs%wwDB!@ zCWW}EDuVZv<&xoWLY5CeB^YZ@MWp@B51a0I*SWh*EHd3uu%D}OVhj(_H`zqzLXjnC z0yfcNe%In-)aGOs^{kV6Rd`VD;0s1Q)D!X$>udy>R3NHgkk!6zSm!14Yb)5Cp^5BF)xC3wfdgS#9&xC2ea zaz2H&!3IyFpsg#cNl25Fs%|KohNWxqXuM7c$$-iFCWF;YMr+%=_RU|T4T|Ap6*Rp2 z!8@#MZt(Rtzs>sA8A1!jX>5>0>{bPu(4wr&leC85gzt5*w?}Fd*4H=DIw9ypP{;kw z^{?YugpVfT*p6;$jEhJd6X#nB@4Cbw6APIH+@@I)iL*8)cE|4Ol(GBS^{in1f^}W8 zVLUoK;cLUb?!>zj-x6h%SXij1LY z9L6LlWf=^HeJ-L+JkFIkuV`AwY&yj?HBH^HyMKfWaQV_DR>mW$y23=APw=4+>#?VK zOx}}NOEWuUw*Qdn;Q@QQk2&7mWqy1}Q&p6U1$9*mLM2TxX@Uc^wXB~xOWk-LJ=x=6 zI%n@_#<&03f5umCe3hTS{d1P(jEk4gF_?_eNkW?D42uz?e8eCv@Ij2(!Du-~2MGAy zUgYW;Z47PGVr?3!P&y|6sD8#}V!T>sGVWCN!bo>O^Axexm;|e>r2Hg_P&bT;Gs$?Q zjI@Pk*Rz84OIN%Wiv>+B5nttU$?@R<%h`;kDruUEu}R9- z_8CUQF?;(593C8T>(*`3B(q(uCg4P{l5CW*wbr>WSei~*#h z(h)mz(s@Z?verUyq*ihP`XjtDea0jqVsV~r@}3o}U&YIN(dGCc*@^RofCuNZW9GAC z>Z+t#&Z+99bT~=E%E}7HNMg^UM~}F7?{m(aImflD*H~FuWp{6nw|@E-TW5B7;iZ4X z>dGp{SduhDAxBPYlNjP^Y1)Q6pWSA2YlGwCBmU@*{)nKAnqW5o#dpUY3n{2+!!tTv*?BF0DK@Dynt-}nx>5mek*gam{wzx^qFY$7vOp} z9sEypJ*8q!Q}V%(jm>QU+D16>u5DQ^=FDePs&YYa4OO|s*nmw^wzto4W_y#oNC-3> z9qm#KESE0skQmSY-a{Te+NE`#mtVfl>SPt=JsOEPOSIv+=PqL`)XkD>&p*ebM~^u? z*yGC8EBMfGuz$#f3ujp_9Y6W$PdIz_Ea%RiV>&zHy?5WEs!9T$7higj-6xMYo*wh^ z%P;fB8?OV3vMd=43I>CMrfErx;p&wuT)TROG)ZY)%k=n|>n~mB+U2X9(yIq=Ps-_q25_KF0V+HpWs61{6hs zF-cE-eRe(Tu%2Cii|aJoyQwS6Z(F1#c(*};lqa_ow#y^{r!DDc>e=j3~G4( zh37eU{yekUjB2@LYiql|;hk&Q-+jW9M~}#oggnovn5CW}lvE8scqLn+br#2?yp-rT{rWkD`cQQ$0lot^r^mG{P zv+G&GdUpLiUmaT6yEaBwwYXM{+jU)2E(FW0(LL34F<)S^4*2Y|&q$J#G)>rjc%Pf^y~B7kZ~G4;bY`epMe*JtHzo>2qF+9L70d-i7{e6#Ej`E zq;%dfJ)ZLT@nf9#RAnWd)5;2?(Ga8HU~iW+N!Zyr%XBu4K^8JM+B&n%cr+4(w0A6) y731-^$5<<)`*~7Vtdbbk@i$RfpIyJ2*Z%{>-W;P7r`AgV0000>YvKevd? ztV>_e0EV2QW@krh(wbx@)06a~Cq3w&U(?H)Y^B**&I}0>=u34~UgB~tu7?xV-5|jk zfCNd9>;r4dMpss5Mr52XK6n58b1^gHdtK!_JlFG=v&!%Bwe>qa`PioqiKL`ym719|gp|=i@aq3=q+;fmc8Ge>p(r zfB2iX@NxYB?{phTnHgsGZ-UmZ{`}7&{QOlw{KFiPZCGf(f{X82*q<|qeFuj15jg%F z8P>0U{qoIQ1Tzo;F@a{7Gz0~!mIkCHR$5tT zWu;ywa-Ohy;c|XWJ$(u3imT85p8b=bFg|^O-(S(xBO>oN&+oWde_P=CuJ8J_caer5 z8&~Q-6f>Gt48^T0_3c-*<5zJ0CA!`r;%RQ6`2qY6jXQKWz~L#nyTN=wOfYfV>)ZR+ z{~phah`c`*Y5&Uk`O^fikAU?T09a>h(TGV2c|baV>-R0lohBHtC&C-uGl|)!S(0=1N#?$$L{(Q;{GY_a6rR=Y3O)m z@-AF7`GyVlC=2)=^IY=X5#WQrw+<&8`$V)qmdtv5OMd&3<^C1r&Hsl#{gN0ArwJs` zoWq=gI%K>dU44!oK0$W3$nF~A4iuV;ovr;oLg;rli}o$g)t?S{eGCczbjk5|+?E1u zV+#3*o?pWBOYHm-clwfY_m5nD{xg<&MaLbw8}ZJ_b7x;A7nV9vn^4U#ABZc|S}4;4 z)2n}E|MagJZ$Bqpy}%7uxU|RlgoK2|gvPOlo8q=u^f7{zUk8ot=!{?2hpBwSvB_gN z>Y!B+FzfjxlLn@UDW--!=HlpJDpo#Voej#0m5kL)E02Fx+A_0Vj;s&AWc~8Lu^hi3 zg-EeIE_lQT#1v^@d4kJZ@|*vLKfJ(Sy}<9DBI7L@4?ScY4iE3*F^w6*gs3?wK!g|m2<{yY@M0dA@_>_5;k_x%PnKw9bH?{cBeC&)9Pv@oC{AwGa; zuW*)3T^7g-HP2XC(Q?6BftsOZtYunWsp|~W12WwsZ6=NfL?Y%A%@2qR=$5lGl!imr z2lA_5;O@S}#{nNkYrloikw=6|?$-WnCWu>rawd zeV41by-O4?cW+o<{|q;O#m;3!3RYIEWt<3BGhT%d9Z<=0MyyfPl0#W}?}hf~F(U~W$tJY`+UC1ZHh2TVPJN1a1e@v@`U$~q6U%bAjA zruhPPLU;+zkz!&v92l;y(A`sPc#4frkaz{VD+md35mUDF$k&CXkF4@H;?IX-RQrz5 z^#SV=_k#hhkAU?j3s~R&o{2T`<;dMH{()Ej@PCu)nNM!7*o`Ar7nWsWy$Z@fO{UxG?slbu&sSP*-RLX_?kCir_;+eMG%OoghTi1vCseKcX5jYmhIr`Hp;f zLzy3_Inxl@-7j!{M0})S)KZbQq6iMfc}EBl7YAaDco)#%I*5w)J#QIbBQ3AwQmH1O z5!8VOoVxAvdCZJdZz$&zWxlXZ7nbSFJgwv@BT^aW%I-Xo+)G?^XuQH5p5u47Xxc#> zA?=WKg^bsj3z#VK0i*mkD+vZBziqzEFe^V8;Q9zyKVY!=KHpPH!!Mb%Twp!&W_n=W z?eN~QOfzMvC?1uJT7f1&MS!}l&@!b|KuIa~9CWFy)5Mwri}!dRaWUY0K%ED3m{l5` zAt;S10W8CG$GjdXaX@^ansAwVQr|>T=kYG!e8fAC4}t0&JXSD~E-lzLQfD?E6%Z@5 z)_4?CO5EYqZQyNC7E}bU4&n~)6V5qQ9nJ@wQ&cd6)8sIu){fpVMGp} z!r?jL>M1hbAaM^aAnvi6`M#gAePbR>wwuha7jDhInT35F;C>ju^%1cC0su=8v=#PI z2)767R9NPTvRpXcuUyVEr7TnfD+RxaBc(N3HLNzunsMSV0p}DmaLyrS%$JEY41nNb zB*Yydcxp3R%Sg$n6D%q&cd&3ydRW(tT2|K5uvRhks0;XzIsiJsX+SsjBC=H*w+fpe zIBQT0aSeweUI}SLeV}R2Cy5BH@mMPbRf0>1_oymP-)}%KhR}LAy%h*VH&9TAV6;{- zHCihj6h-@Sd5`!A!GYVrE&2}RDRu^z5-u%pS~#ALoaPB#D?uCH8O}G{yb>NJq^^j9 z3;)Fau*cuLAl|$njJIeSX~T%d1Eed&$4&PIX6|cMLNWPu=Ebi@jP`5MKO38IHo}8pG&Vt77xY-JF@Hm1&+Sd8STh*7-ylJZ{^dwN|`1yeQ%wrBqro zRP|kdo0;`|5Y{hbb%+MM^R!k_SFq5qx}rWnYe>srMr(#Or8Uqnpg!P2#Hq*mKv3z- zNtO4-#Qy$*M^U^eDoXGkuiAkk1Y8K1D#e7>8fIX%^)04~ghwD$R19mahm=+@5t82WS9Vm6%*J7Bp4qUC_HK5vo3svw5oM0jyEVk07Lm1Rkbta;OW-LWm=5yC_iJ&NI zj=3yYR!W|6b>iX8g%Dmb?*1!jw`1HT!hS%<=eYgTuKNmmh(|3b z`>?3-!Hv~Ec;+{WQq3BI+kopMVEqZKAHHry%z7?pJ!0z}Vi&4q*5$(K?vBg6QVizH zi8fED!7|On6mcrJ;26gNFy?usVKjr*8mfX-MNP5RsHIX%rPYcB>0y_TK)^6sOZX6J z>jKS#8MQV{z`NK(9Fd+=l3wkr=4fq2#1QdYojx86vHiiqME~8M z`cXXkC%3A>GEwheQyzYSE;Fa&9dF*g;&}g>Y0Vgpby?ADxD@c-K)b zS;e7HRwxAwYFn|IDK%4Sp_YO)59*<&4rH`VB-^W)osre;czVyFp)?iP&QA}I8>N(< zv=51KHxeAQbs$d*m+8_OZY|VYcso_zoC;ALF%&{NGmgqQI#O_`i}?L5aes^3Kf`uU z;qU@I++uOx!_{x$gZ9XzzXnua`<=)0r`t{CBg6W*eyd2ZUugAo&vO3-^?XF~kzaoK zbKbss&Acqs+E{a=mC8OOVhW7Ag!j6IeFaSMtr2oV=M`-Y5yc0^yDn`ofm~OX=>kqk zsst)x9x>MeptT-K0WCMyT*%ERt?R@@>idg-121KJ6p#3X3qrJkDh}@k%*C$bQhE-| z8rF1^)f#B)iYQ+QC9_JUS`TLx0V&%i+^T5eajv392jIGNR#qm;dSuBHYpK*`WascL zFvLAW08eLVR@V+C^SG4P&5UxL` z?MEOWl;4n#()Ub#JB~-NQq`}e9gNzUo48GU`Vp``uI~s~QjNM^IKO>~ogP@{BVT>_ z6=hkl*2rt6=8Ag3f{~JE7y{mh?V=3ib?z0k=n1<4TaDdrWZWfUOqki$t|NUjHlx;p zv)Y@aW2A26yp%?s7nXVAGSAGVVd}745bgOTRq5I*5yV+%XWEb^1abJ}5tncw5mK-6 zi5k)h(F7MOJ}Bz9hHMe2y{Z^Xrc}r+V=ZD%dRV5t2%rMe6k$P1qpcU(d}5g&I6eH5 z`E<{5HEOt`r5lFfmQSzugtTRdnqkWVwRYCEu|KS9rfRG2a&XQSViL;eDK$Y*Vi*~A zBjaID7y{}V+O)I35UI5iHwT7NjPZ8QvJ}d)QkIqJeBssU1QpVd*oDk~t_X(Lx9ncM zVt4fga{W)#o1c(wK1Z)^;pQ3U($@mNZ_0Q5+Vv&xeYv{T(5Bx~hyEUt^4}9+>8}Xb ztm{5LIwbzlSJT!tNa9)7mD9sLd6}uXQfeXR0vIa2obME(4>;%E-ATQ8g0842DSDiP zG!E?c2U7BwZE2d2&@`ZN#QPD`);ncdh1RG!vn(^0^UVGIiDk*;24=|h~pmh2~Wd&BPfWLtwLs?b<-gA+PzMNHeY(OUz8FYA&#i; z8ZVJ9?VuEFIn$1>S&y$cKio6DearcB;kd#nEX3Q$?(-Xx2&@?{6U=kpybYFI$==a| zC&Zo;Y_(CF&`faN2*KmMV@MIvfnmRAcXc49NN|dyQOZp712q>O>wfAyX$U0UcP`l) zZOvRxC+=Rqk)82#F1QCyThXjwQ zbX%LCxR?k*kRU+rd8fKSo!|AyS#8LCp`G3^FDG(cAtb_hiyxoBctwf>SfS+=z1&kD zUQynD#d5l^PAk)CW?n#VcZ@NiCfuFRT+TBlN^Om$tX$@aMTDgq-ZgHo52P4T-CBfv z4`rJOE(HcvLI{jk2hwhb4-qF|we;$vEzqFVO?|#KS^F^bFfs-l!p*bF)90UZ_xvj! z-o9o%XD;W3d0AO6nY&Zteri0~?>MY8`Ep^HPF!6s_^YQ7uHf(tcl{~0zoiYsuk7V- z-r2ep7Mgrmd2E!j;#~ONLd4%0u*BHR-2Sk>i$4(l^1+w*!-Qz*g=f4|oD}ByjET`q zs1#6eL5VT;KfzHAN~`#HUH^{g9dhN-b*5niF`@|30ixT5xQs~MXnTE38vcPtODvAU8qP_7r^bt7(xcN0PKN?8l@vT&MK^4dkRWty?( zQ0t-g+w;gVDCf(>%eSw2^KegHGI5tWh^Xi3=()W5f}|OZ5!pRuyn0UDUE$NNtK)a6 zw>pg@A@#frfseL>s(Kj_V;$jwjCtIr_qXaWu0G;00h{O0T5 z-gQHW|Nin>{(HEMe`HfXT#D863~fQ`(iQAAcjmRV(WojucrM(f?~~BYeSt7 z9<@%Yc<-q+S}Ryvsl^e3C!js_ESWmJ#Y&=zL#mM1!ufpWbUJZ=|G?!kQET1QTsf63RU~DNIp|bWY`&LOh^j-HgD3IR9R@}Gdi7mj;v&4o~V}x z%5o$n2kr_*s0Jyoq`Dy0(V8LanRT6+E}6W-vQ*Zkl3k)|;4&57-p#bSQZ(>zSy@&H zBrG{hBjy4z4Tv||R9Vk=c(2s8fpg$}?piY~g-p+}^f_{Pjt);S-STpO1X<6=r2F@i-u{4D{&2Ke)(o)~SueEd$Xp7! zto`n7Lh!w$?!99iB58<(am2+P#f&^nNLkquLxfh5x)MaO7Pcer$#8KFZ~ZKkD$L87 z(i&@Pinm^|)YwpM z(Qb|LPUJPoC8f=s9N);R~6I@ zzb_2S$o16??bFOMU6{`gTwcB8e7a{@Pn;)@g~*Z}$-^*K)_&)q=}RQ!w^U*F^(g{)pJ5Rpta)tK#mVQyvgL+Xsh8&kXk_<&Uthz zyfp7|>Jf=}F#qtJ15PArf37#<3S0eCS09 zqbvFyU|aL`yN+k;K38TP)STN|h&)~*{%`}W(AEp<`3U2Iaz3#x50vu*UJRcSE*XRV zoKP>=Q)IjWx9iuyCS@@BupRp&!}_?sZ4S#RE=5vG-SMFI9xxXi>cEHYe-&cF z?QV$Uo|yJ%+phPP8Ltl1Tv&5sJ+4$U5`wREhJ^27j5VC=?w*+9#WRLL&`2wVoGQ0z zWLj5pE1-f?#}EVim^cK_I3$MT39dJ6FQu?73u`sp?m!$yh=H`<5h+k7gbGVRPe-f> zRnwA7=u%W{S~c2 zT_>jduQ*M-XNi6H- z@3h0mf!%n(@YH$kw!krT8z%=YbWbYv11?6?1Std6C+u*GmF`wb*-;lqp|D`6Db6c~ zQmc?lMP*Y#mo7{2C}<>wMpDl%6>95wEEkmEJcCn`hv<~(Kx*sKi}^y%3%VZ(F`_;p zLn6fhWx}%GLSG))HNe{MOy3D&f>b2u^)-i)7G^!#ICOIJ5uiu-+Pi;E1Mv-Ac4IkGJnP7FFaMCql|AgJuEpZpQKOJF())KANO|01s?3_v$ zjf$cv63c+B)(0y{>&~U#QKo70LkFEpcW{vK?yf4*unH>L^D9meJgEs@8a2=xfYpf6 zle`k7;oYW`FPTybrXa!NLc*t^1CAL~L*^Nw7Z8ZM{>KkpY})Aowp>`InKnOwyl+2| z;R@smh8bB-SUW@7VF&4+R<#grpRoJv-{Ioe8?bGKaKOc$v%^}~OO}ODR*D&xD=x3d zoVskH8hJiZYi5j*-LPYjTTEOR^Uf2~eBq&1E_or(4j(*46fC?OimIwab+{04uJ?NC zyS~0g%_~^Ng@7~%7NEMGyQ+C(TD}97@PS^^VJ(A6pR4FLPj@x&5zz>BCJrO}n`^Mj z>HZCKHoo}TD+aA3F|O~vWc=i3==?Y2@e}m=bJQQOkSNXYQ8w1~5wJe4e-*VHGIlZG z;p!<*Zl3V)@-0@O<%(6IHl;P&`ra~FLDk{CVrlG~fkJSO5`P$1z9tpRH_zC6xS*xE9LZx{sqt8z2e)~=H@0|`A% zrjLVf0p~jN+NypgZktaTdU)qYbclo$+3j{%?FNa?-{MNkK?&tLLju-;LY zGv)fn=x~Fi9hA*-=XYdU9|7ynAF&{g$l)pDlNa1Pe@^fAl9{dP{pl?>%dL;UQIi;0E zbEQiLv}@+NRZrL)QT^8b)14)(c1Kuoj%E%=?eDQ!;Yh7pmwYBH&zTn~E!un5N@$7TKjWf$U;hz2k-)^u* z7b5%gJLR)J0@h!`QjZN!(8CQ+pFQXL$t}mPUgPM!ZLJz@YxG?&Z+lp1V{eYG1*-*G zrPYifXbAY$@FCFT%ygM~^XAB9no$iLb|asE{(^KfGRDB+_L}|G9t}#fM)JanVA*)v zy3^=st=O_D-CJcpM0R7uh1gqhS|v}FJQZ3MW~)R$bDAg8xZv{yYwBKDb;a4ne3lFC z^p@q}HB~(>?KZFUUC;l_25!L89@|}`6v!Y^vEeBi4j|xc+WJqVGf}HhHw)7+pgv(N zSecklNA7>|C9nVGcqzx9001BWNklS#7mazw15G2(EDLa7<49%tR^M+90aP#O*E&a1UjbHPalb3KpO`gEY4>kD00 z;_AD^yKTLhX7&AuFL4`SJvuXVZ?URENCRdK^`0gW4?CWOANA_$-7A*MKlAD5pP+lA zVp#hT+62+itB8+Nfj$D($Mua2%M1wv7DujcKVf%$;PmEg4{sh@JkWk&FPW?-TIq`T zRw^y8P%=^*L6jIz~(?Vil={C>L-S zYJ|y@+$#6y6Vuz?U-mk$$fwZ2Kj=m zXWD#WSu!nol61yEj6MAEz}_KY=m}>^_jHOQ5)9$lZh4`SX{93J0Nw!u z){KYOzu;f~^M7JJFZ}J_{d->g)!*Q*4p93jF~We0331Z@?Q+ljaMu;?sev}CG}P~4 z9dO>`)&(~V(7H@PLqVk*CsH#)!L*y`wX)DnPP>+?)^4gO0#xfEc9q_vDY`{z2F~@@ zlWvm8*TzNmK2GNcBz6xo=Y4Nf$8av9SJ&Lc$jhJqoV%9~Jlh@c`8Ai<4VqwnAZqAc z3+jGofF0P-WbYjM@i548D84@2{Y>LM@efxv-YZdb;mY0xGU9 z$PoJghCD&bz30u0%UamiZfPv^iXmwSI&LEyD%Py$#GD85J*mGr5j>vG-u_dm^OpMCaYToR}=oC*%bhCR)Pem!4a(@rPqT$mrupoPX8 zQoKguHO&vb-!epe7|FXme%uq{xb+*>cVpU|>lHbt+S#+~OsrMgtX~W@gW6qJoA-p^ zdnoNUD`@pwsJQ96Hj}?fx8Zq|#z<>8?M@T5=3b-;3BMb;EsfKwFB$LeIE09;GjkSl zbL^jal3e4W{8ss_?-#Jler>bbw`zv|H|7;Rg5IP1s!|Y;|AK>Sat-7Wtx($(N zRE+lMVFlFM$ddc!l}C@G)@1@b4t?lDOw}q*V7J>bjw3H#^y;Gbo)8Dp?!fi4Pl(qy zkYX?Yw}QG6WQT7vc~#1JQvhdCOj>B#H*NKBF8_PUE-x9Q62z*obsiRC;o zT`siK8P_^{qwbIxpcWeLU3E;U^A0dCccL9^d-}bRUuB5FL9MB?~MS zN@00;%Y4b?IB}K6?)%j|lLh{l|MUOilYjU3NQ&6`HQY^GK5m3K^c>qVQSKi&T_)z) zxRix#Ge~6|GdIr%4u@xGh#ON{xSSXKIuX)H2mx&csCXB!G;Zxl3dx|Btr)WTQ~}NU zAdSX0U5MBx^HlA#9h>#G9(g|*`*GBcZj*!BW~sGVLwJ}`ZFrP1+?jG1* z-%yVi?oXM}0!Bby1d`M4SnuzknZw#Pb9W>y`833Xw@jWvew6;3jOBLTJ5&LW<94OzTZtn8G^%&!+UF*$4&17aoiEd9TEpD zrC#Z33JFLnx?EBHJt;g;&S!jG*o}^x>w)QXW@(iv7tWV6V{{}D;yA#NAh^!-d5Bfjd%9vG)%TB z)U7My^E@#hk7yXUdiE)V5&X!%|6l(%o_+Qs8mgK z$AA7g_Y>F<(ZS(j;BWu#Q-1un|2@OgzXq?=oSBYqnJ#CRsWMGR>bVlEb>H}5M8#9I zH$yk8IG48XxAs|&Tb0$R5<*1iHa@0`RM$tCz4L0-K0<8kzr?m79*xbK+PYPA@ub}z zFOIxiI!hH{|Ktgmmk+F`J2Z~m|Lk9=XQOJu?`{yEh}$@~KL}viH_ie2hJUl~VN=^T zzpj12Aig_T{VuID_NN6{0;t3Mh)E@e&>4&LP1#BzFAKF6stUCf+y~y>#d2p=YFjgH zZ<-FFx5hXGr-F*7HdvPxH@rW`@|bA#sfQk+f$#2~+A12k->+1va<-(UQFNkcT z;>!xow%_&G5c`0KG(a3kG2y1E1KqR|<+8aucv>kqbzD7v%5@Cn5GeDJix_S^kSJg~ zM0P!FErmvgdO?ft`K(qUpOJFuiS|5ia*nR`+NIE)FjN_Co-sZ-U@`UAJI~ls5c8OJ zZ5!6$^oIGXpYrPdHR0(eTs5K4+Y3Jb>mT!zzyF_zFJ5e3@q%xa!+ykt%CHl{RG8kp zX1afa;ux;432uZCXtq*YqiC0nl#(gyLR-6Ed`bzijL44G9L{`al(kPXLJjd-6eGQf z`f+5K85ph)1yN7SE2UOEx|u$L#Duh!{mpaMvXE}}+`alQ9A922;R=6vh6^LYftX~Q z_WgSVEc=Zh_OA_M{5|c(Z}lGE5?ueB6YtI==@#7`2(iz{Yi6|8sHL!4g9TPGR`2oK z48YbJWt&6ieYc|VUJ-McDOL-m74q6A;H*nwCE$h~t(9K6YOOm*q=5N|r~w7mm1at* zmDVcJ56Hgp$@5!c8W9)R?L51EzzqSShao^3dfSQh3Dc4y;p&=ro0*Rf%nx^jge6O!)}aGpHJ)FXFq zXs^G5TqxrniTwsJ4q!XSa=)-1=M8`c0!kbPnix%uRx^2B$<)qyUe0}lAb zPydm#?IGRZ!pJl4aIVh=;9FwFcLXdCw6EDAo7o?2>wh;ul<%3c{3+p;_KQE=ActoR z*H4M#$b6ZxR%xZsa-R{XG!~>M=0$1N$5Mrm5cMdYDiL*#+>CWysd*vKXD*kST8#aZ zXZW0PCDYo1=02;ix2;)^=$p~<%rYIBPjB%p6I~?k_IMEv*L`C0cy+@NQ=howeb*%k z-~>wP;FsJc#PlS;2|DKsZCd)>)e9|+T>&p!Yl`JAFIW{hD@-S9p1GXvsCnY*$>%sf zV5PkiW=bhYGc5N+{^%WTu3h(3HzmC8`#G;Ow&q@OOZ|14_0}58GxKF3?{3+D_V>i= zr&#bvS)i?3-q&DhSYF|LVSRW@xxS?x4pecJwouCj4FT~h%jp4eq1*k`8$^U$jYS=` z8q0K{ndi7PUcY(G!|OYehyU?E{6~hH5%rFn+Zzu18$uj9aB1l>hnD;JGpp2Ey3KQ0 zaocRiK24}m<^^@iI#1NO&kPv$1L5i!&z{_H|DXN~uP*Jt)_Rx(zF>9R5(&#afJhl^Jk-zwx8$%!sLOi&AW=`1B*DASS4-B-+SUNNKr+x4NQ zX-Mo`Anvb8`FMs||*lt8gT&aV2=@YO^?Vo?U{JeuO2G&V>8%rOg2xWn~(#nJ^(*~FW zBtt1k^c`r!6(J4V#Oc~+`e}P_kB%X^ba}yt(`HSUSso_!_5`-{D2KxBX?eTIDW;?{_FqClTSY5 z=IJM-{WUSA-ydK-g2sn{Wgqe22fuV1(InE?@2=SIuXuR#07WR$u(knKZQC%@gr_IB zgEktOD&SP9BB)Ef`8Il-@5$O`efWU0iqxe`81mA^5FsKp_x{2%W6Oo ze^tww`!}z-d;N;b`AExaAOB|dt-`|JE{FAzUHu8JhS}On;6vi+C(roh&%U7KLNTE9 zvGld|>YxjGb0JY$>j`=(3q^HnkQIUtn1G9cv>PcUV_P-Q$_nd>EHfs)tGQc-wPEW- zohI`6NSi0>bYU^D%|fND8SfpJ%gk;ngz+h9AJO1(p+VTLKk*#^w1=1iFpfR9to}cZ6n=#kDd|GQu= zymmm|+!uVSg!zmc8&}@3%#J!O%=ZtxdHa@^clYE{xq12-pWa?mFDGVyLnERd+B)<4 z%U`nF@6a$ZVeH}#r_zP-VdQ?DnNAP9eEpg?ukZMq|L*^1?@gL4%d+dd@0@e{`}*hM z9v%^y5!qFu64js@0U|{jVMaPl0Vo0pv#|7x%y57H{N8={*?X;Ty+xd6bX|ur z2IT`&EfET%4cazHAuvrx)9mT0ElOCtpA*TH&I$6-gdz(m+;vk^R~5#X(BV7xb8q{j z|Cox&&o5#4`(J9FRc-MgWs)S zeTnZh!dSeFDB~$2O_6p-UGIrI!*n*LNMn*T4gm~e&@4qMA}?`Oi(Fq|>pe>Nq5BFQ zpNNvMpfDC;YJ^W9&k#`ty2q(K(n?4pe3C${ARQr{2nE*+^CJ;~ljP-;bTSFRz^>!P zClC1eqtB?N$L9qiFDRBvT$WOGYYwXrhh`Q_rZ?x{9B1dJ)SCwFCDX+cjbuEU2L-%{ zsXK?MHmG94Mb%?JxzB6IM>qt%(IJCq$ON!jqkVu2?k-Q*Z};e3#bi;^YeST#j3)*C z<%;<@=7+r@YTAI{)&Vo*{LeoNkN&>%`8!p$u0OEGqD^2ZIqNXaVYJ7+GN%zT%z7kY zP7&yyUHGbP*3?zVb4&PdA zbB^pA#5gGMy^#36CBcD7fC!;2LS};$%^{*_&{R33B^;OgW>Dkn03cK$u}G*SDB
lauFs`eaM%BPN$SvQdu86sn8ZxgD_(oNgNOXO9>msGRqlCCR<>_Z@YV%blvm2~d=cs;<5()M00)uC8rMB#F-zH77Ya=` z9F60I{dP~g+aSHib(;Np#bP-{E+U>idd|N0JbZeN6dK!WwwEiaYER!a!P?^n-P&Ju z!TQS?HwY{U0pE znm!<3jK<3h5toSAg54u+NSY3)=27^2k;J7DVr%i2XZU)Bvn>vX$a0v>7{B!fzx&^R zg-C(XHC^9R)jjoYi|%_Y5gO0M#fBt0<7hhKGV(N&oP*_zQIXQsdz=zfC!b*JHRy&c zFDND>yo~AgTgtNF)2`uP{F~q7fB5IW%YOZk&VlVatdPW6iBcg5)-(;?7`nEhnB{!< z$G=B9$>{bCtrZ;4a#q&RR2B7ZN8hzU)SBf#7n$^Lti!tE`G~9SfDcXKRq^@z&Eqe5 zOE|#Wd>jf^QH&TB8M+TKR2YxI2lkRwL*WUlYv(M^i4dXXLPO(X2U4L$hf5P=qz36j z7@k{g@NFDsIT%oZZr~$}^A6=SiS#7-h-f@UW-*i*aXv<-B_dYgrn8zNACs3Uahl^0 zc+=rsg|KN*WnYihCTVb&8I-0XH_I*oNH(Z{du{vF`tvXy3 zvD)mB{sphauXAf5xWKXMW8%p%My}D-n%%`SHfQG)qnu1m(GI3%L?sI7Dh}#XUQ0b^ zk3JyHU~8b)25muW8_d~hhV2c#t;xnyq}g%*{u3HJ*=UT9FHli|Z^ZS3PxmdRYX_`# z^5-rJ|3(Uy9~9OM4)UMcx&39kw=YrN|4pdze?=-*7)r|=uDpI_hVU)pJY`p=^qofx z3isf{yL#G*YxArhRO^xV82amgRX0!^0)^aRjG#!1yU-=6I?Ixb%*S2xQntBVLX1{A?g~D zgEt*QjYD8+l!k)mBj{H6%_$_FH@;sm@N>?;C7U;;IHVYh>f8v}LugsLwCS;*{}X#;t72RKs?+=XAHhTFH&+ zF^$z6EM7;&nhb&6zo6JWBd#xabK-d8H}2ruOPCx|2m?*ae&6HMf;ctgd5(-DWD@h% z*Wcm?zyEJ(WXg88<8pt=c4yg`nrwVXk_Yp4;ISE;v%@x3{nZq#zvzuFzEG@$_jJ9c zscO8ns6>(`1#y-PV!Bt3ioZZn`FvsWgV6AE1D)%%VgGlaaCt;vbjM?SoREyC%x~VN zK0Uz`F_{{woeBY+GVqSP52-jR@*zxsu+ecY4C(QnRtl^nL`5ly7a{~3U~$G{wL%Dm ziVf1X$WGufDBF-ojgJk&3XE;hc8A_>AuCXm5wa+dk;7PzwF(tyBuNQTjE};6EAXHM z!HFk><|!%yUBcT?ykarrws`P?eU1+umGJ4He*%O?^n0i`VUtKgR7}D2_(+7p(;Mgo zvPf_;4qT^bpmnwlqV+fthht!`2b6jm@IEqvG;~~cy@LG-q8EXEE+q67VjqPgs#o~7 z33!(~Z;+{X!u{YhqHbYd<9mn9N_4x$^*wfbNweBwq7+xRi1Q2Z3MXPNd&k4i9+D)U zTlelTnoKE$<~ZunLbKDC=(VEi zDgRD1SOS5UDL$Uyqns!&SRA}gV!_xm%BBtTC2xYZh?nN_D2l?Lc^~X8Uc!LqHC>M! zqSSq)5HfT-&N-Y4omP~IA)PqJ$0lf?ya}^1=jq!D+xPU^2QHU5N3BytSs=0$7fWOm zqp}h|6J*I8(h;Bs%S;GBm9`H@y;KdB5sRP;VGMCHU{hkeOb{{+DKUQder$!e4Z?N! zb_cr_-B=ugbUZ`ECFEJyQ0g|Q)uRlNjqz~|)gJ0D1UY0GB!fQ7YruwdYnkGu2%g5G zz^u+`O-ETCKyUH89lmYxYK2Uf;e=X@f+a}^(0iQikxhrK3_?y2sU$6LQu-;)uBY!d z$fO`Ha`xWiFZTE-#*`DztD5YSr(`PP;H{i=vBYIll5WL(cS$QctO$9ACQV3g-zLvS z^wkDg1c9(~8dc7bGDfW%gxuh?!6}LKo~$hSt$*^L^8fsw{|XZ)OmB{8nue2AMKYRG zx0-x3rJPJj^L)TPbLFc3D;&D}m#hTu+?RGTR68Dw&LI{r#9!Z3cR2XIp8~kQgV+@EMoJbJX5#i7R zloq6-M|()d3;bk(v@N&|f{NZ*x<=Dg4OZ)*6%#gur&fFP#Th0`5k-zF3gU5%N>h^Y zBG`pwgfKnWKGJ?Obgj3i~V|q(A zoJgJ|2(;b$d12>PWC=p};FlDN>gPB6A0 zn;hVr2%)r5Oy633Z|U|MMx%`Nqfa=yxWo!a(+HkDJ>mScCR@&e@jlDRi-I&w1NC&c z5B<-fc>hZ&-LL#a*JG05Dg4F%*ZZKN?(3TK({om5FF1MhfQ!eU(rqpn7a2_)k);Ji zoUl_KDGy2V;$;-$Px(f~D;Si|&8i65cA?$0n5LntTcRu_FH78&0Pye3hB3?sgc#wI zL;U^)qVOc69jUIF&u6T;K(iB=vZAhHfG z6j4$liV>n1gG~^9jnf^bZRnakT^EeVDpCj$VV$LKJ9OJ)R%=`w6VE0%J0lw}f>hx; zXu%Ady&ln9M4SZ^vZ(^YX_!ZmOc10)xagp|w@vsQ)e3eeusOqN4G2`8lf*6*hFIX7 zL3kZh{31r=8SJ;n-5PH_A}{fiIWkJ{^)`ex7#}do5FWWc%-Nh*$V8%4f{oS)Um;A4 zu;qZzQTVz=Ofo2!!)d@Ex;hj_>4Lqw6*$CS-kV}#*rBW3_NzD3^ zO+KdAp8Um%X#AYRwk2s=Mqm3)%#Alm?_|h4C5|%~&2V;$-JIf`MjHp|48J~uzC!vS zQ>oe>PlR%guI*SHAMum#e?N#_ouX^^NFu)TYcn3K6>*j`8kgin5dee(&d6FD7+!zQ zrtmLZu&xK!HlQYq>ya*q46PC`A#PW2J?H7`mhJA6rmk79FS$5>f$lZ4#S&X)pj&La zSpbMYcfW`sIRF4407*naRHffuQWqI2jj5}Bz*KngGe=mj7SF4Hx88sav@zFfs_iZq zbG@hQdvK0yRDw)!2&DAa$JW2q1xyIM6j0tkGzSP*lPwm|HOLzdg=e#?uIGzie2+bY zf}8-2v)&?%#2b(E9m-gmXc&MCfl!)QCio}~x~Di9icHuzdfj83$9YMlBBTm(2tkDR z0_&k~HMZ4wFNmgdlvAM)^fd?#%?{se!jTFQbWFO&3o|^dV@Sr=NMfmX!JzC31Mq%> z-<{zvAHrpeQwcK3@#7^bmSNMUZO}>e4UP)oJG@Lln_%zBrntOBCQ0CRB{M{uLtR7L zBC85A9d5Uz2=jg6!xCXUf!#JN29(9u>!8tc;L|CT#|S0E0;D;`cUuIfU@eb7c%K(f zPx;z!{Zl+adXmm=pf677R~O{t5#}~@4_**&HO}m~kP+oZGrQc8jVBc58O83B?2TW? zPcpnpgK66~=vK4e_4rzYjZh9$Hpes-)@tZAUPNILg5}O(&U@eeE><@@+kTJ7Phar% zdvCB_Jz#v}F54%MC`TnXZ{8$HVxnkR(O5&@w)&sp;yP$z;Z2zC;c%G~3tcejf&tDn&*qagu&%q586p z>Wi-p=kUhTR29v>!fJgjh>Se6RgE9c+cFA8i{Ul@ZQmRUDIqQK(>HLoL*hsdj}dW# zbb{VK2}W1%(Y+qt=c{e57`o_Jt^*&ohTer!7`>r)j$R71ib+IEsr&FBt;Y{MaAOG< zdz2ETGROvoxb|KftWR*lBa}wqadARYj7g#tOpD)F!5rLF&})QB!aS*n!wf6RhhcEw zp3AlZzs2`8m@fRpje&Yc^Y}iS(^I5RiL#RE(OsgE2vUhi;H3oO&U+lb{p(-^NQFoXqQnuEIdVKDat<#QtH;lgSdz}Mjp5t~PESvn z-MdSE<0d_hh#g87A;H@Tbkk9<&*|1{`rRdwHza9FlIEDM3pzTL4lqB*L7wxifBX-r zw<}(J`U$I(GmNo3et5#8b;S1BB}@)zjc2#p5yyed!EpL=)?%-C`|76;-v8nq*41zC z=$neZ+S2NttSm5FNs;vkXR*4c?}CZ4sdg9}$R%l(Q$ur_C z3s1*zuDza@{jDurLLtfn(D%T1AxbOHNz#H&Yot3PPGh#4Dx}Q}$Nn&47`iQYMV+-* z%`Db9tOsE%wS!dFWPL}mxnR^(WMw(nP%@lMa6*zK5e7mmy%`oWcw`ilq$Q)-lt@C9 zWyD_M_BGmcU~8PM5kldM2`ZZ+2PCt|XZU1-a3TQt`VQ<4-|X@2E(kSUkFHmoKX|~i zPfux#V0m<#!)%W55p*_$RLCnKs=%ulREE-d5UZ;6I+9&v1$c+-dT91IsZgUSJ}*P+ zjx(W~@EuZy-chvavohhqbEmu zMRUH!tWMF*1xl!}twhl49(0E_j>~NYz+#f|)vp|*7O&Ip&#?&hoyJ?mgZr0U>M7@K zjp$ky2TOzubW(q~%^z~BiXKf09aYQmAJW*wg5T3qsNTq3w0dMK+J-dq&>fH*1 zBuYwDl99zJX_}H3MPPIrN4>8|f~_>nFsz~4Z5c;%gqJvRbrkV03zxW3RsUH&m)0RV z-Ma8J_tsqVllrc~H9=Mp+VTh$rNrfk(R4vRDzTA53iYKnpuZJ5E-64Hi0SKiG-Ce{ zk>>a~Wfn(xrEupjm`%o1Rl{~)y_|%(V0&@a4uwnL>>zcpj@~+SYw^aSgeKaww9#jz z2RFG{tFQCal}P|OjF_{X8-&N>(dqJ6w!D1 ziDYtggX!^x?d4~v-XIz%4l?R2<@D@=yUtKqiD?sbU*q%^p*6b~pFy)FG96+x!lFV# zHUg29^rq&;=?lL3_JVs;!TcNFrgxe+irKC%xqa&v|NFoG9%_Ef>2{B{mK(=6$%=yG zTerxv3@OERli`MZO7E`*@4tj2;Z@7-hY{{*u|TMZdb7n?gX;~QGdN@D>Mfh|Q#KdR ziSh|)=@?A{rXx)fMw1CqmV)ybYw1iMR?0o}eTQs90NjBbJ`S;fdCMkXm% zfE2G*WI>W<%nuI2uw85F?GD}S>Gw6e?K%B+gXvrPzNf7l((#nV?Yne`4YPwois>95 z5#CTSXqZ07m4E3~3v-gI3;RE!;w6HA&yU~0X@jUABJwfGVa&qxn6Ab&6{B)aUL>s6 zJ9KZt63-9*IqR?iMTNEwZ7fE68g1yB4r9W6bJaW~n$GY^!NINDBr-*e4v|*kb}MLV zRA1wgn9*p#D4h_;79|~Sz}l$VA(|jLa6S$^cdgNFO{87G1cvIS+JD;T*27 z(9M>1bHVQ7l#A0#+MOXz6XrLMIe7gZqv-+>r=inH5`2^)q+4>P%| z1RU%D?+cxm_Xg3oh_(Th3}V*MrH~9?L&kXPhQ#Hd5KHLw4I_iJw;g}rR3=NnB`&_M5aRyqQ7=ixK}oXzhqg1R1z;>JeeY# zrPe@`s?8eejzWhym$$Rv1-mlLN^yOj6++Nk3!O&F25&7*wHvlk z4%;_4(~%?zaWNvv3X1t+;DpOz#-fl?p`r*c9I4AFih`~lvyW4}tvS6orP-`#sy*$l z;{5RgwihQHzxPcX9uY~3$uw}FUh&XfrSx#6`u6^MJ1T_wxglh~DpFFULc|g|y+hwr z#O-rP3zDNd6x$W`=_AJD5%cAO#X-;M*(tmAj;__=xHY^pfejDVc(isQ%)&W(O*obt z%a4EfAx_1-(RVDCOX4_(=?z3SLhdec^_D~_%F!&?I9!kKYkY44g4cR{oDhv~kd#xB zatz*LXpy4Fn|c_M$JlO%skgYHv(jb{&IXZUS|H|kU@xHEqsC*h*_5;#A>tS}&?&A3 z%TWqahK^1t@H%kb;~eraBpKcqaBZN5W*(tT;J<4D{T^WrLM6eP)O7(Pljn$XgqTbR z`Hl+oRD2Msb}eM%Kr7WIY!98o?pCP2q3<0E0&Vr?>xe`l)+dZ_eFc2Q`cM9Enulk& ztVj19<$S_kdv41F=`D|+oKRaq_j^AgnICemC`pnW<4oYD#W50z_l8E-2-oAZqW6aN z`4e6%CFA)5S>EOO#~X^{F?m-}lqF>raklQ5mIYcy6xoDIC}bS-*4u9}olZ%UK_Ko! zXXUK@g5v#`P_Tpu1I$+kxK2Sa9;4fi))~5bPqp2!S)FkH>>2xuQ)HB2I}P4YjK?HJ zNn96{(Krmel|)5~NJZ4Hfi@s!EAKG6!`dFaKpG9UCs70Md%D2dp7D)agFh@>V*+{I z^?2zKu_PalQBjN+4(nq!*@*7x6S{3n(>tPG(={#5Xsk7_=(4Ud6F>hJdKWZh9#0fU zs3@qOLszD*wB^6zB`aWgT{eToSJ^-9$hs|Yk}^AblT<~RW=obPB-w~Kj@gu3n!4ru z{1RtcBmyG_^@tB)tU}0OXF<_PiMEdYw&DJdenQ{Y9Njr)d32M}Xi5~t_+o~aF@QwF)mR(tzm$9l-dQWWFSx-$14b&NV1M4&w%yA&kQ7z&Ed|Gpy?d_E$hcV?Cnt zxY{H0DRwMSqbVxSaVl&-y#*&j+bFyXS}h@lh%bY;eF$5P<3K=-^PrS)Sr`~Q3&{}0 z-ZxN$@QT196Jg-*I=oiUw4rM&^Dwk`;cH-QIK$*+n9&Zn9A0*7_doiOayH@M z_VG1V+Gri-zCx2Ii|`#6d&lR!@W&8#dqSS}fl%Fv(;6kP8d&RUE%cpJiOf7;;v7w@nJt&>y|k;Eiff?pe|{g&0~ z3Fl8AvpzY&b`^MNc6&A#&k<3KN-~nXAS;S6e3K%q$(_aZEmgb6brtP?N3~yLy(3a7 zah5a9Vmfb-+bzw0he6=?NnB{VlRRU3coQL`kVagL$rd*-#*$5@ zERSxHPv&Ih_~mTsr$mf3+a24p7wEo6ND;(vqcM3gBF=JziasAm`75b@4;O_Ho@g?s z=QmhA{vpNoIiskcm>*LC`>sW}o;)u}lZ?8l$ywO+A5U$HzoA{&)NaY~XTUn zbLY-&X445#tO(<0ckNSkZs@RV*gF4Gg`-~_G>3~-5k(3K?AB{`=PP{IBecglL*G<5 zKcd-eLiHY~kU|R5EW_y@t4n;N*_)c(rp0JWk`%}!Ayx@lq=j`kiE#f&B+W{Z%tE9A?fd?iHX zdP8Q}tu~xJdBo}SXVi5aGUahgIDbZIXi7{6jgOh|-q6yp)e zJKv>y{($Y}Clt~!THGSFnrgFReR2xkkjEL*`GhypglDHKw&yDheNbW($X8(=5n+tO z7&qM14k;AXd6|>sBc_W(vg95`Y!TjLjYfKbOj6=mPBdL2R9ICS>4+kM zcL{CNQ`Z~XzQ-mhNjWB;AD|S-C?YAAC>gwc#ymhONnYew5=P0G;@}98jd4C4Wf48f zj}R&Y8R6Xyp?7#E5pfYz{$7UJ))0Ahb$x}@=@zfDkYJ-Mm>nX?P`buloIt)n_x)62d%;5d~^6|)2hMp?!iKylr^LWHu+t61-A)AztYvL|B)53rbPWrxddZMu#6t9K|6rNrY}syi%+_ z_scrgr>9&zd(7jHKjQ4^WBR7Xm_e5$AsJ7&@!DOE@4mr}Ten#p-6Ai?B&kAPCnU>X zv2IHsR75Nl@oVqWOqNv7e?-y0AQ?wYM>C9pr;k3u<*-~X8BOObmq%P&ta$v{1NQq0 zGbHc;cpJQgS`XM|5hF!#;~QhxUvAl7tcaqN)#({UeUG;qCj?R@_$@P2yodwp7Z;E?P6X?t%*f`qiASEPP-yLFJA)Kpy9V3q zkkTw$ybZdrD9sQ_KZuu8TxUYEaax4#%e08*B2Yq+coq0sJ}m<15RLa4kPd|{9{BU% z+%UWs0#QyOjqzQJcLHG=M6(IAv3`Rv9bP5F0KS1Vhhhv;;L{kP1X17PPM?8@QMYgN zPWI1OJp7o)kDgI|`jiGk--R&TB#B8n9Tq2%r0Wf>^IUeCk6VdL6kor!z&gh}?|p^; z?!WzAHXr|x9g;YiP&X~Q?y$z9c54c!nZNyYWHurelAE{hU_SX%WV7Y*ix!KZTrQc- zW@K52Tl3Bi_m{e+wp@*2u4B&rO1y-_4KCA!@nS*O_Z+_dI?i-B*P-H)s4N+c=ZqI~ z#dNQjwBhXJ1&=@cfKR{o zM{G_{aD8z9`yuZREzs*V&(>?6e(*!m(TK&ZI~?78gT?LFIXXOKI$t2;I1KB5)y&sI zAR>0atJ+!ZV*L@h*SLT z6zTimIFK?7*y#o&bp-J!Ad~wV`YMP}ZHw#ewe~A8$cnI8%rY1yh%61q(9Xc*h}rZx zH~y=C&O7hEgGO?>snB)H>gh9<(+ThY{`dI!Cyz;tAeL}r6p_c4|M7qRpHQdwnSArR zIB#)H%k0gsurxKY9J7D&l*yeVZY}>Y51yQHaQ7C)q-68iLj*m)^I!gF{J($lG4oLl zq9aODmWKySN24J35UC2*knqa9boe^Sm?b& z8jlu|?BEt8c+=tfj#e9H^TUB~ zp~*%C^qT$YQ}WpX@(4s$A_(&&OoQ*XFgZdbW$4^S%Yaheo+4=>9dI~(jgM8pt=5do*Ld(R|5qk&e2eARzsoGoF>%JPe&bDk`=9>js9A=(`7O-)lIqc?l=r^IqaT09#~(fC{XhDEx8A$WyKmp)om(Ye zeeWGK2Iu!gk;hxZrw<;{)E(zLO;Qw$=L^2^&2KU;bHZ-J4Vp`VRN~r65l(BbzzV)Z zKq~ytV#53sE!LNl5ds3pd5hK^-LAn|i%Jx6mWCsjlEJ(8YGL>pqReamn{b0^G+eCB zZckNLp`$X;?lFawi|k@v0fm({2b9BywQV)@)bafL*RuU45Q$cCmzqZ^OaxY z^;WQ15qKe)v9|{VB^uMo}hoP0f?fKBV4P%<_!I z;(#L0*va~`Oy(?zWFA}(QEkWP5dMcnT{@GG!B&zfk*%3kJx|o6O5HC-}xp? z3Ph4%+YPMNcpnoNBXr+$e)J<0vBjo6{0Ps^W^xH7x_a5(4M3!S^hH?h~{A1W%VCt3^-~VG&o^kx2{3FEOufq5! zEQ7iR``Mqu<~gQ{QTOiQ(8wsGzq}+%V{DSpb)GEEc>d9SzW2vJ;J5$5uQQ4qP1ljk zMyON`x=RbO=gCL+`CtCUAMlyUIa$?=mt+3f@B9~h`&-{;JSs_&WH?n3HtQh_fF#W+ z#xo}K1$j9^C24>qe&JsDr4UE`wKfZIf+R^vmg$!c>D8{VjVF^SNg9(RDZ+Hr z^@h`nHD{Zisqv}l4!gSfu+LYY=^=jl@C|1)mZP))?o+bc;q^a(AT0~ z-Sv3eps+ZlD9VDo$Y2x`7a4Jua`xFL%%*b=Zyuv&C4M=FgJWb=0v+Ckd_Z9=etm&H zc?ykW{`Pl+0CzHjG)6ds@(P_!NmNd=Il-8oycltLzT@o08OwtkOqX;1=nvoL=-G4L z{qDEJ=kHTwS`LZU4iN)h<6Vz!J#y>=4@*ku+i)}GIil}@1ZB6u&vV)Ag+^tP^Cy=i^AXSQKVq}#X)rvk74GmJy9bXDam0K!XEL5qWEoKuatW=4C{A!g zM%_Jl$6(eq-&kkRafCX!fa^QFW5Z!h|fNFpU)mVWqr}% z%uBqoQgV2Di!a@thVMaq?t8tmA6#j;g1rTl_UxWK;)iFaeDv@C9S5(y&g)-!mm9b4 zGP`lacr-%A@heuOzlpJyAStH2`R#wi{qHAy{Om*C#*q~T((N!K^5&QE##@Pg;-nr=9zb*5oo^=#HH)vji~ zzGQae2BSPd(t}ha*#w#NIAbx|qP50aOQIA;YlO3*QxOuO4Z5vqOi!c~rt3-Ll(@)= zvKa?O%KTq{`r+U7n z-x{n*@ID+JKVLLnD&PY`cnC^yZphLcpk#zJ8eS=0LI{+XND(-1uJ6#+@Zy6Xa`MRs zL`g}xJmB^lZ*%;{TP%-nGhf_5#q!#q{a4vteeqK9%9D(8e(gKI$@akqBzIjIOH%=eAOA2WyYiXPmnfv3{A7A>nk2TyWo@OYZ@EjMMo4{ z@+>FPmff~ydvebC<0s6Ij#%8h!E`ZZJelI@P`bxjht?Kj9Rh)IU64gsORPlDYPKD= z-s1X}7D1~LMp;Q*ju2UjFUqhXRuUhl_%ubDKJ5LK0;zDDE%p5$vwixIC`y?ez77Wq zL=wZ=!}$|jwMJAM{PrBzYSe3QksQpac4tW2G097+CX7tvUD9Z_jo>5`>^ION<+1E^E2e)&Bv;9Nfzj+%!_VJ>A%bhjt z_-Ga`$RE?BB5=KS)NaWJi%x6t+v9+D_pf@Sc-*giK4pHq%hCRQ@;t|JUBW0~xVnZ` zn>gzmcuv?#AihtxcJ9knRRxpjDU+i;0;`anfXL}nn+8*-7~6p7fh%bQi^Sp)4Y=+oQOlLr)&d#G%RO2<^CMk$GOLWFe}7t?;iEbwvR7U#OCHvU~*#BqPJV_aZf zRzuS)zV)aJb3p_EP`ldjc2~_MP7X6RkpUbkgng(_&=f7t+iMN5k?HJ-oPxc zQSQBgDfV!>KE{ukr6r++Fl;dyC-$(N9+#H3SUS9ilnwibC+K2^@*A2)Q)$bzYN&Oa z$Rnkst~6m7;0Q~lEAn~DZ10$(e#Dh$uCsCN3f&>p!lIQyHv%gi?=W5aALu1?Knzq$&`dKCE0r zCPU<84>>OhR72B5*zT~!zT!Tzu5g!Euu7vJ?2%1pBm=>NuYC=XbifVRdhR9aJGXiN z=4)KJ{1jooN13IJj*q!_f5Pn}OSpc8*Y*$4)qNuW7+qC}Bqq0t&;@HehTVj~_ZOTi z`?2?%>v<2if{$zm&$}-kGZwl(>CwU%gX^?1maHmBi;7MsMg~2E2$0fSYhX_L$es2rGxAZ ziM&@)M>mnhN7Tifvx5f+SJ3MX=>w5XAar3VChm55J`8Zb`7QF3W9Dg!?}tdoMLG^m zt!T7Ch!&61O5u7=8-QUgwQ4AiCp7s@RF<>6J;CXAaGeM#+6+LWYm7CxZJUd&E1I&v zWOGcNVT_^E@3OhMLEo1!Iiaa)3mhKaRjFtZ0RKEhNrPPc~$ zI!Hgn8j$l5r~<1r)#(X766HZ07%Ejzot-ehR}sDNSwx+akM`O9;4SocN;at(_flqW zy-jazl`sGKJ||_ss4AF$@D1|3z<4h6`J}baaU`BdNUIdb7hJh=m2S7Q$eAz~L~|kJ z;?EX$A!)mSXD%9pPg1OZ;xS)RO2VYa@}(PCe?V0g_l5B z!F)bvKA%&RIi;%6+H(3QUn9#E|IL5*Kl1GJ&*94RLMMJK0{xG<9RB3j2!RYc_}ed% zABODR`7-w(+$9Pks`-RsKBd#?(dqYyx-lXQ@m9B4zVQ@V8{)_#Pg~L_fa^GmkkvM~ zP-{!;zV9PF7wvlOCU9DkzI~UKlQGNN%k-Dm@uF7dVpN4AEk;OCil)eE$_&Z^56z{m zRf52$>j;DkqMG3-jXthOKblcx6O=#1Tk2zEfUipGEaT+PP1N*=N((kW{Uws;z6frD z)n$9Qc9y~QFry=c0cW_yd~`-FJj#5IIXz>r`ZN_sj9z;USt?G>GSaBe<`dVEOF8!s zPMGHk;Tdk<+Tq26Lk8Q=wPt}~r)9oR_YvYMBo5RCR!yLsE^cfG>m^9*Kr+P6Pe68{ z-}+D4e2h^IqAqB<5qfsQ-S-~gIX-pZF}(By;b0jxJLb;4d*~XLR@Vpy18(i*9G_T5 zw&K?9U4kSaQw_rNsA(4+jcNIqvpgqD$Mm`$gU&Ladj45F*Fi{V7S0r&<6Yc0=Tm}R zKsDk*o${CL*6?q`+rp6~g8@;e+kVrIvk2l`?AWBZNaL~JM-GG#h;}VWzt<;{g4&ZP zr=YSGN-A2@+^QY5>YTdLh+>!O_%-zOBeHak5Ryh2q-n_Nf~bLYfIM#o3N_zPC~ImRVg*7rI4yQ(UxGGjhZnapQo zMMXz!!t7+Ta!*tm`=|KqlCEEVX(T+=8K=Fx4c4ecFbyRxboRw;MFwcPygsI z`0&mHn!4rbG>h%9(5$HvrxogRansn!sbgmez*TlUTN46@0P_)6SS{JxgjVoZa z>(X;v>a$at&MN(_74X`Oz$TrNO~$D4lJVd%K*S_?t zEWP~e*l-o0X9(#pWLH2s!%2qNwI`WB*rBe$bRwj%sQi%A)Uf0SM7;q=M`!F#6k#Wz zx37q|O7xwZ_&4Dt+#1Fi$cfwF}89+)mBJ4I*%p^ME6q#JYm;k&Fn z{Vbw?8Pc=1m^Ka~jH%8h;ArDBijw}-=SUCl(CNfDPK|3y3SIHw&Jpwm+&ezv zox5`mvH&+p2xEs@`i#>O1jIrztu&syIA9t>9LM;9&yDL(@Jqk=MLL}r&v#pLHD-}_ z`N%Uoes8yo(x0LVw!=7{f8s6Jk^u#Ut^OVH`zD21p-RMSI5 z*|eiyQ)1KvJ*$8Mo$gZ3$5eT}u$`6ov4gHGjrK6Ez?D9})9T`^D#)zBHvXc8bsoW} z+EK4D4Qes|@yIst(Gl>`qIKT*o`0U!`l48sWyw67lBOAXr6_AnZ9p5b2pYAB2Ht+_ zO+NGaSLqK2Nb7w3Itc;R{#(CB7v13xIf|_GiPtW3Ww6Th*Zir^)jaqo-8UQwn7fe!||~E@x?u?kqE}B-QB@-xJ*5pRhmG^g0Dk*EQ)RqrZQ< zb#V|Nx+~bg!w47YxG>xTp<5g1@h!gc5B~wf^)=RC`2u=+ikMEYLZZ(;AU!%HpQZSn z6=dMygnfpcW&A**lRjrh2OwQkcAK;PGj`Gh$KU4QaLU{J8Gd333&Gy#lzEZi2CWI_ zR8_csh*cHRDm>rAcMM4VNDz3feGGEZtF(uYpS9kFH6!aqbO^NN>dqwGSJvoTGU8zL~923;NA|ivs0SwOE^i= z7Bc(sarxr~|KXb0iXW~kJXg$%AF+EDScLD>-@1hCERltqy#MAmncjVy6<^cuNc#B{ z)qKcc&?ia~e18b4#O4wiclgq;{~|BF{5*g7ufELA`+MYhg;JWj(I|T!!fSD?MY;~Y z>rpqBLJ#7wh$hGCwEc;tMCc0R2MBA>r+0Az4}WPDZ8T*) zBM2je1P8_4`}a7V&N!V^?4}3Y9i`MwgO!p|X;H>9&kbkeg59Gj>#N5&OUo@qp`0T8 z02u@bqfv)@=*fuLy}P{s?bo<^A}$XoO`v8&haa)am2-9xhPU7T*z! z%aSBX@Lb8It5ROSHb}33rQ#({@g}M$9ZXZ02QWJ{OL5dI~ES}S{ zm`~3tW;4mWa#7lEiEid0)^yIRI>)WPcWdY@ikmAXQrZP5FD@ALjZ&yuQB)a4QIO{) zSy@rm6{TuWjinJ_q=Q}%NMqk8O1f-l4Wbn>G6H0;|Yy$DRjf(S}Q1;R;Q%j5G~0>|myct!BcD(6gN4a2GG1vAVLx(tq^plt;&? z+CsmBKZuy#yUny#OrwY;T-H~6oQ%deoshc7kSay%iuCA|*WOP#9Qn*^mw7ekbe@tM zgA$s2UK4o^j?+3gcy8+uTvUo);N!Xu@$xdIZMb}8i=X?#s|3D>=eBT-UEq@KeIXZS zkBd^}w86XQ-Ie3Gtz1sF)SaKHk?=47AGLtQcs}vU1}wtMBdx($%30bb3%fB++{Y0G zh#X@aGCjw01X|?;Qc+|nlexnz_u91NHkaul=)yJ+?J(M#);vNvdC~~rNN}3nsWkszFwXxKVp}_&^(m0aKD;s?7nQIK=h}Uo4WSmY(Kl*@w z^uPWuJo&=&y!i6x*m~j`t83fz2TKG|)H)4_)~^hEzVL4;`faw}!qfiyWIc+H5%}aM zij@6<9hZZ2Vde5Rai@dhCH%qv^Uv8onQ{Nbkhq3Rr<$jVhRqd8QyU@!(O{WIffFP= z^9#Sm@^G2EZ@tOk!HE5F#w1rfd3lXr`}tRh<2Ja}NC%}gXUF?Q{Q*T<;>!j<4p3Rm z-Q7J_x-kc*bGA1X@n!?5v4Ky>D?}H5~&hAp@kf*1(Q4a}JRfWbQOUG1MPFYk~(R#ugqli6FKqD<{p3k$_ zmbtRsBa9M+Dao=Ky+9!BBC%)x2;)dZf0blyn{q5jCleZB=soi^Xv5w+Z*%m)8J*Q7 zOc1fTyn&Y_OdE&&J0G!g>lR_ZOJF6b9q=b#f0yCLRnDfnOm%_vJjPW?*|fpKaVNyo zx;4MFhPpNg$01BY(z+scBsZRVlIu@ir_<>W$05G&Eu?A>Q`@a=Q@w={t;9|^NGWj~ z_o844=ltH03&o54=@+cON~y^?Hgf z8IYp&gwhyT7cU5rGC(d0*}2i6#r~zAA<3Z6GcUi4mvp%G z_8Z*4eT(^M#5=nM_fKoKS30b%Xr6u6<8m0|+J<5@0U5LWIIBHT?eBwOz6;LF8CcxUeHJw@4inlKfzDB_?-bxSL5lbwGOVvZF;mjq}l&2dR`Is zmPm7jwmErT;fEdOr-!7YGbX2J)V0Em0;&dl-{A?*#q%X@AczNjwl|lEqXo*_^GdJ!EBjo88+F zI6l}T>jG!0U; zhxYT&KE+c{KSj5f5CkDX7~n{W6ar)H#X)_6iSp2%PP(!Ufbo2SFv9h`*52H8kxomf zer#~^UxxVkXQg009$Nuj7VNz78V7goqOHaE9D=}Y!z~ul4Qx(b&d{o&sw(F5g1Q!{ zx4OVIFBf#|IN2G;O84X%DR8>Wq&PlV3EYHbHMNw7Mh8Cj{?joF^ z6$ncy`J2D|iyWWqGR`w>t#N#ZVxEy^8B4=q%V9EL>Jp8M@B0Lv$1I&8eUGk{cn+i% zR+rZ4CIMAG<*i%yc;#>W8oHVB{O7;K_LV1i`nebA_LmT@%elzY8pFd)^McT~z|`8G z&^)H&lApL9P1BI38Pn4#XJ@Az@9%Q^_3tp*yN~Bs27%z|>r1@ysWn#DmQcn}6$PE; z4azddPZFd`v09VwJ-}@&jdnRcJz`v0G!CnMLDW?EfrH})eEI8da&k1`<(IbEzIKC+ ztJh$1fMXks4G_L0o1IW)iaa}EmMYTPVYGitUDZTeo7{NmGgLVEofVe0pP|3HiVS@k z6pj;Mbb-i5*lY%VL^+<2W>c!XWI7p<9_=w7oiHEG5g4*r#+z^NG0keaflDuOxwJl@ zx48~sjHqhLTG90czw{fwO8?mxx%0<=fH@nHo@LzljbEjAV~hImJ`kd@ME!MaBzgB= z{|k=h89@@`VbOWP;V2`Y&Zvz?UWLp}Oyq}rxUPhc%456sn*R@Wi#NeCov)==Hh_i*R|7%WytbJc`{4A#hx8QJj2)blXgZ zZjb(OnJDSt2O+NOAslaELnD7SM#7&s_sey0qX;8FmkQG;jA|`$8VkPX;Yk-iTmv6O zEN~M=T`TH3qsmjNBB#nzR9RqEN#nHs(-#p%-=iCRbc9m+ya>*j&1U39L8%%lZKzCp z^9!eKiG|a~cN=T@;)^d(lsTjM49D@XzK@VT)-|}1&&t|Wq9kTCKBY)!cnFHJ#PwW~ zPKR_pM=mW<7BvkurBRec&FJ)u!P+thd-s^09di8sNBEvYQEP;hEDx73VMwPxpuaTa zm0$QJZan`Y{pD8a-&h0Y$9oMN$D!Zv(eL)yzPe5Q{PR5Z+>6}0^)7Gz+1J=P-sR-o zGhTalhtEF0$%AiXbGB2$6dBvA7L6C2aM|>s){0; zv$VFv&fY2a9-PrxT49jR(RqpI$4Ez@C&%Pvf!2a~Ey0g*Z9!!!ibA0#QyzSHi^G#K zOIy$22Yo`{B`5-nRmd<#dKTN=f@q0q?;TDL?qOxfkh!R-2IpToJ+5~3afqmV#ahl<>2){rz&cK_3QLk zmdNI(c>Wr6HaNTa$4DCj&tBD;M)*dOC0U6fYb zKRYAzebP}%6vm9sMl2;Aq#NJ}Nuet`{T|nzyvFwCCUFwuICA0aYahu$ctpW*F=;%s zEpI7H4vx3*+xPu82}`!t&~lM5^s}=i{7H?U7Y`)9-&(Uut7)o+N;()*V~nA6U3}NY z2_n28!u0~Y&=A;$Ms+W^QB~TCS<50tRXI)BP}e0&RhUL&ZOfNx7Li3}fmhX4MVe*I zXDNAAQR#+KYqS+8>Ed_+!fm^~bK1i&3VG?tYrJ{)E?QaAbPA$v%aMY9Z@_FmVmcpD zHHL1di^?-PQGjU-Rio*2dlZ$z^*mxJDYIGI8JRY*h;%~7^D$OYHHJ!+NL&t1PUv>hM^}5)13; zF!8y1;|fcw1D<&D2B-T6?C-qKgZJLx+i&dh?eE^^@}*UNg9EGIb(iu%3E*0 z$1|UP1*0v}fnMCjA1q^{0Bf4o^IR1q{T^TZMUS8R!e^*wIgZv$PmU16AoL8!3CJ={ zRb*sYOql&^Xw-Df-mSM0vO(0AYF;zfu)NY`xV%cy z6ufbJ#7Ady=E^c0_DQ-u_D|-F@;Q;)CW2O0^7NHUjP?%EK$_>QbO*SBps^0Zce!%y zDwj6a>GwLsNrLOjMMjI^5ue!wrYkSl?XB-sOUGzTE1Pm12iNoQ{C1(`dfsAD^@F|P ze&QqHPkJmocSktc`G`BOeTzCxX`1FDZ1ubwauyfR4MLnnC_-zs+kU@I)1c~#y2>xQ zttv~&=QFBoN|B}HdEPoiG@4pz%Bn;uMOkTzs-&nYDzyk3wX~KwZh#lY2**Kdy|~F6 ze(6)s;}p^J>zhrN?A>sM}&j!w|l;8=rnT=JsAk35o2pZ)zkHm^U; z=Jh9e>D4dr8^86pKBk*|?3VI-o@*LQQ`KbCoP)z%cJ6-2`)|F$o3DS1u48%bT9;2h zx4|=4R@nLIBeL8uT<&3%!5EDnI7GcJt`KzkORR2PLj+!n$ytr6W~4hi__|O!jS}FKoEu$8niAM4mt$dVx^$aEiqb3 z%V259)oWK-UK-L#VuHZO_gtj2;8R|Vfewyi7g2i;!(fDT@H`LC4?wzjen=R1==Ayw zmRCqRJ^Ud2furDGvw~%r9v$+*xBh~1Iz}l)ts0ufv}v~1Twq4$+BWHWxUP%iI!MPu zI(|E{VKI$D)ir58qnwVIk4~7L95EZ6F`v%JvW%=MC~HMo*C=CKmU`2ksM-RqkM!FA z!(E7P8{GylxGwzHf9tn+@4K(FKbfG6CWw;OG_F?dCWsU_^8f%K07*naRAupoXqpCO z3zn93!*Do6D}|#pg;8kL;7EZZ8eHE8;owOZ*Jx^GZ~_NcN>(;jx&PoJ=Bc6^hQwY# zT9>5rlps#U7;IGUY1DPZa90Z>--P@+yBn9pLzhkKtaFxkuB;E zrbF0syv#zQ8)nm#(eWueckb|&fBkzL?A)c-Nm%McplgaW#}8fBl91uRV|!zWV{3ZD zn0$7I5FUf2KAYQHOim|kU4II<-$SdC5RHyIh&n^nU?h~IQq`aQz6E0m)X0uK&9e7|)vUEU(>4~dcx zw@&ek5+{yOb%yX_raK=YT@Ycn-Bi{M6%Yn7f$L#?7hx@DM+aC{qp~qoqtLY=Ok9NV zINlj?c$RZ#cg*g=gwslKlGV%`h4ej!g8{x1A~6(Ij_dfyAVgZr>G+H!O6Vm4RaR0o z8tJ+uN!vxOEDu>*TcOwM5k(y8$Q_r}(wS+{o*xt2#Uzd~EQLO6OCFvBVdN7=0_pnX*_b%6tSv7iZG{&_ zxHP!QfaSGK+$bQMw$d86vqazsYE=?Nt4z-B;fE_YUPhBCoWQ3_r+6x(@_e!fdn{eO zjN>{uoj&eh1D%f;z4vXTjF6s0TFvQ$Bbp*7D>8f}-L)aT;S!bdz!9uozCxMJ*}r=m zV;elrL%0FLacJsxDk$oP>@>v-I`l%9H{LnqgL}v9PZZO-;;c~Qs;0J*pudFcI+SUO zD=oda(*oati|hD27>&vEIUUbs7bZ<>8PdiCcYd*isdIzwPMdBOebB zdKQnlcuok39|Y}zj6}K~o*xp#F-fOKw?ClU9}q^#B6~spP^$7@3(y_Fiz0$JZaXNc z5oi{kVi;?%jd(;((=u{fA+Dw=Yoz0%%ACsgasAdkQF->3hd{arrw>M!xZJ8!Ua^DWBRn8**P$_C-+Rx{dI#@U>mS%_y{1eWD)z{X%e zXXO$z1*iAM_`XG|eXeY+VopA!7#)!5n#c`_I!Q}IDN1V9pp7PsdL(_9q`ORA=13!m zy9v5!AWNy#lyts?DKq9re?hW#opN$UQ)hTd2QTU}os8)Y`JN7Tt{LTNjeP;O=H{CS$n>!cNVf5i81m*;EXjis>WtnoA~27IMQ#mT}^}U21MNf zQQSeg4!Ulrng(USN*61g3oVshL?s(x9(Gv5vbDTUHJw5j;?*USJZHGF%GuE|aX-Mw zfLd#+GAHmoj%Q<@zV;0BqdmMNK?;E<1+kSNJdDtk#^G$<2HI9lf#dou5pkiLn4KK6 zwX#C#dHAAaKUY)|!XUs%gK65BF0B-v=h5vXm_{Kym&;d{c=@>w|Ky*3hlyyY{E$;M zW%tgzV4Dk>#iQ=5k8;$$myv%C)Qg3FBkpy$9ES|o)_Lan7ukKV!`t8aCO6;yF6rc$ zqzUk&7<`GN8?36CR|SC|aDS9??_`4akwZTTNTko8KO_t;;Z1s!QwygVFMsAKmRFXT zj}KVh?z8vd`;5nPp1gjQq|+rp6K!0=^tX|=p;9$LUZCoNVX}m-ONEF$ zP-ha?lju6-+V!ikSg#}C-Qw}YJ@5IK_W)-&wg*`Z1^_K(K6yAyi- z9<^$)!l$$O9QP+KfA~+{0*!irYeE7ln$Ck&Mq7>>v@2 zgX8)5VMG|mbb3AFq|+KTdgp@YA8qpb{|SaAzRyW5evrq&$4&yR8;(A_&Fi(_%`F`%t85nhQ6D_Jxp$bB`<98`4@yqYc?S<>cgm2lqc@Z+DNg z>5R&N5>C4TT#TLP*WhD36~MTH|LV8?W8Qr28+g4Qs;n4~M|i&1-uzP1cs{mPpz3y` z;)=U&>v=Rn;t4?|eMB_C zEoTH0Txn@c!(gz4&Qm0oL~2~eG8haQ_Cu1mBr7#fJ#mRn$D?=o3c=bYFV+s9)x~X~a!3S(z*(CIR8quRFYx2n%-PI21w7^yld2I+iL4PIU ztAF%WTsJ`1aC>JLtjp6+Kg+?)VVWsMXCn}rZ{6ErS{owQV`+JrB#LPOj0UYywxQ1F zBw-h243qf;Aq1VlGF?w1U7xhBaD^aA5(djdE^lrSg?{U`@3{*A-MP@up4)<-<5dWO zvjE*4XMtzQ_OXx-zVG7&F^=ov`T;@MMzwXiJ-WSqOJ@jL!l;lxdf)U@>99V|*Z5He z1ie_BKIC|`#_al$g{pY0H2NZyS2jeQJ~9juRSk|r*P2FY8r2rzMm#Jea-rXo3tQwz zB?c^fsD-hZ#v-I*^Qkr7`IDB{RLxUrRilhS;b2;+<70j4FE(XTa%FjiqkDHyzDt>A z4C5Hx=`fwmc;eCq$0rknZfLAUhG9D{B^}Cg&gpoB=Y$tVXi?mut_o)JF%B)(P#cZ! zy6CFJ4+4~cvMk$>Pd`FfO}8 zM4`eSp0%J$s#0{hV*d8d+&UgnX>30qE-gqfq)z%J?2%6Y7Do(b&n|Op{(U_e8#-U z@!}5aNgGl!?8N9wQI{D-T~cYou#+H^C6^`A^H^D4B}C(SE#6sFC4)F-ZFQNr+o99# z5cn>hcYaVm>hx>caqYaDT5zO3E=)c*+HBu@p69n4KhOJ~V%4S7={_u0?vGcjeyStk z4=!4dc2ov4+My{&I4jTKc&*R1n(tty@1tZ)viezs7cJJI598#mK5Zk%twczd?#hti z#wJHuj;vh}^}`d~n8mirA{Tt9bAVe20Y*X7p5j(`kG!acF!uSvXNG+7=l*^E=l}li zGe4VBRtjSU&7+n%-=|msG+Og3FMo!e`}aU;jFp_t#;s3K6mW8UiW_(E9Z47jNMJlZ zV|PA9H~~=@BO8VALV~zMIiC_oJ|t+ChrkQaWwn4L z1X@~xAfhZ4zG&T6t!*f(49{I=be55;4ktJ7FyN&pB{7X?rlDJ_Z_CEXE>rnN)Kld zdJu&^s+dq>aTR!hk5z`b6`W2pgcFhp%UpTn+T-lbj4!`7;XnAS<;5Env2K{@9{=q3 zKO}DghJ)NS!MXXhXMRRa(Z@x z?}c=vBnbjMDUm_k5`KYBugl8vkZva-iX&X-{Js8|?pN>$VgI8ak6~$pbXqQ>9}+}S zOJV5tNID&&D0x_{oFBjZ{ET5(Z2_=Iuo|HbQ1@>!d+Q(LNS|`h!$~gTOHDm52m*oM zf05(6e-F2JgW;tYFh_4vR0gXj*u!s=jy$5_GF*O<;fue+#^uYbFW2Pb0|I}Qy0U!r z>+iC%vWclHvOFj7CBl^m?a)~YFhN4LzsF#+%hjiE;5IeyzWF}WaYLgGrnZ#RLjpPC zzxek${Db|1!}k}dI>LgLtv|i|{tgPCf8klq#;254v?(vDWVo_HI-XMH1!ofe^Z)d> zIk^1>AAR^fr4bnE61xH!#8j%r@gk(L6!S5jACl)Kj&$1&alyHgv}xN)z-gI-ka$kJ zZmt?lUefS$klF8b*AgG|?lPYo@5RSuK91wGhl`}OSe7ozQ%KJxh(kKv9>b+&*0#2}@$_?? z>^)%T)?1t$98jB9z&^<;d}Aq*4w# zei#wO31O1Z?GA{NWWj0=|34S2pL)UiWS3=WT_!W?TmOjS)|W}AJ$8@h$hbp1twB8i z>0(t(vO2^s-X$#!eS65HIHuYC3v^W=+#WOmCpW*z`e%QcZn4M7pZ-terzMDjAnc<8 z2TZ}wJpn6Mmr18*xUNTU(7}yY$mbcJRLCGle0B{>h?JJu{SSC??S%NVpW)BGd7mp! zT|@R`s*~3#w8wA$>gV|G-EXww;>S3?KH52)UxUjltDKFF*t~q5(>;SM0)#0De2X?d zv!dbd+plxF^C41I_>PaVn#O8|iN|P`ar1*a{Py4ZFM01Pe}vLATt7y*l03`NwIT=u zY9Piz7-)hRY>wwiOg-mHr^~+Wfil!}LzuLw%tcYOMA|q;YeN(SSSiUSGwzrBEM0ku zq7k4gtZexEEw$l%oHW)Vq@*ACMBN@s zo0nMKy2b~$-{j8QZ<42Tl(5Vz-I5d+-elT<(G8AuiDCyo5UhG3Sj&2}jP*QbS%Fp! z<8jVJx9MuCK3fZ~uh6 zF`UjOc)rj2YM<34q?%1RJv*Ul9P(P>dXlAKAEO$gI6+8_G@4o)tZoppCeKrfiN<#w zIzdPjbWo1Qb=wX<@*Fyygdp?@d>_yE+VN0)yg144p)8zd4}9Y9#5wkA7h%Nbg(|=g zW5OsQN;<@y1zwdTgkg;51vsAjV~>F!lX(5^@BZ%Z{`ivOze@K8jUK;6wevO7<1_a5 z<|uECNv6nWbBr9477apxwl2YP%yN`rR7yR2K(O&?%CaJ#mdM@`@#YrF>)>>^$_^v}p*!unlx@{$KXq?8mb7y7K#d!8v0tYNYb;1A(V~(xPCR&53=Fp3-#UE~V7WjbrQK7D*7{iW;Fb<5@~pH6HcT z+G71CYcf;{VGXW^swnZarVt*^3pkoh!NF`Y!~^PTj;%_{vSys-$RJ>vmGt76j^~ra zNekeu?}kzYQAm=+L~%qI2Kc^4>xNL*y2*i*QZyoI)rdS*I~;0+pbD)#glxR4q|zuM z5vmngYY*+8$`zudOVaI;bbIs`7KxM2X=UYke=D&1M6`rYGMp1;ju#|Y6|;0XWb2?t zs*Iz-h}uh7xwt`@9wBW-KG-7N`ZKm}rPT3xzVV;^5y{#s4DY^%iUQ_EPAFqUxQy-v zR2(omx`)seu2R_AAjJx@-o*vym_EFNbU(y5W75GrHoo{@Afqnh_x^(U(H)#yK~+7p zEwE-tDZtl~z5Vyd4l`!e5m~&!sMu}%+HK=w?GPaBiDibf?!+VOKmP6C=B;<%U{Xnb za_@d)Ln0)~LJ-GP#$fUsXEHpgA?hJ%DxV+-kXVfFB5OavXqgCJLEA*qE#`97+07~8C`EG=}A z7KF6;VaTE%prpgpIZ-#pS2aQkmXn0cRbgM z*WAS4K9=qi$6>j8hCF(W@!RiE5puM1h>Vs9<31hLCF=W>lL=uEqjbgS;T{JMBGztv zi5I{9&yiuDbni8+sWJ1MFzg|{0B34+cL`hMI9pIar)>YPqIV&|>bx%!*`6|QvD z#e_OoV*SOJQSmzS>43wL#7s3|M?pSBhkbT;?-6RBrHju~8;$7%xC4*tpSjA#+ch6N z7&JkiswtlzAM1Ob$NBYj_O~BU6eXcAvBpO_M^)w2p2G8dI-Q8B%qfkbDoUz+O25B= z5Q?Ixh?0I|>8w12r@=aus!_g&3?j-|(OCG_6=4{lI|*5qQIrK`K5vZctVa+8SZBGg zkT9FhsXa|PPnm`xi~T-T0pZYv`Q8wV3^l-MKs2$300C6%n zVB^9?aP~um`mz6(6^}}0L@V(TZHxB^QQvyZ3(*)f3V9sTD;khj3auqoB`M3YF-;T# zPYIN#(QT`^cJ2c67e38&G9(=xG8+t-j3-Pc6Vh4Zs3EKaTce$&u9|(&bUwxjg>??4 zbrUV7e2(OVJt4q=k%~MBsjMXNU{DKG*khE<@T4S2LTs54gw484Z47~qdEw>f813(p zXE{;}CgU+_n$nLV`o2eQU^xyk)MR-@Q5T?_X`v3nmN=Ja?coQ0^XY4}r|`5s^_$YV z)k*0FnA+bdui2nzO!ba^sagrl@!z+`l)#l%TMx7TmDt0=|`f~JB~`Xl!P ze-&tlCSr9HCQfD4yiLN0D1!ajHYpZ|gJVM$(U{>=}L*gLX~=#Jxb zo#Vg?i|1*4FF*+R)Q#uZ*||?Cnu^4h6~-259pK~em4~ejS}Llt!Vi3uZot5WJ{=KY zY>flfmqPN=A!UM73WY_P3=>2M9G>T$yw1Mo6MB}x(fmZVQPnj)Z5gMQw5SoHrq^FU zP%;`HGRqy8Z{DO6M!fx3-(m6Er|^Q9KpL_^P8lYsc!8)YsfszSs(AP9H@W$#PoK1V zPvfWD*(%%Gb_2nENUL@HDO;pE8(5%}!buvkS^IceQj{fC<*==ThE$E#&i6gSPC|FF zOL^`bMV6Dz=gej^(#e?VY(_du$V9C=SqN)g_AksciGuz&37R;R?ju+5jOt)V(2fZ;wK-xy5 zIcO$vQHXZ}GU`-IsGAB(E7ktK0U1v!wAX-`Y+FDrWg}_O4X`P#k@^^)MhOg4P4VwAIt>b;-Dl9YGLU+0(U7uo5;tHQ+F=4p3 zhjs3J3-y<(<#{=EM5aTO8Q({S>~sEJM2$0KK1fV z4!7=N36R#Z)Q{Od925A8x^7DOJe!jw9hB6hX^QE3I161ZIouoKq>n`r`T{IuPU8C> zp7IETkg{x6X>bOqW4b*_o@dlm#dJC$N>(VwW0Kx7MUjz>2P6wiM9Bh4$7eR3(eZtX zWR<8JB9ue=K2dj(g~dMO*$i!(meWf3;P!1yRv?40RrK2v8dN+IMnYph-SSfQgsDssS+RXj&FuQdbQpWy-p7KM)F(#yX493ga89C?@Ik=oJO! ze3e-`BTMJZvw5@3o;Ke5WtLOqdE<6b7NpLCs|i>{35TX4DRNBFw1b5)#27^6lUqUM z1P+TbP?-YHPw=%z?JPAGQy7f$nbr>H1XgIO3Z!g+MfXGecIqmX#Pifi#98AwqVd!* zXfz8 z>Jz=1qk|cyvw+kwYI=aoCzy1Gu5xPY==7J!g#;g5J>u41|0{M6Q`XL{u(qCX>#c_j z`Vp622np)};bND`-aVqFn|R%rrD&1ycn>jsfU6%6_ZBGTCF57 zD6rczmu?*&YG?Vz=ReEOe)?nZV!Dyx;Rm-_?sPaDj|k$3(Re}>_*5!F+BxaGz&S@z zS~ol!aOtCRs`tgeV+ZC~8yU`;xK}*jjM) z#&gVu`=oh6yw;vQJx$~X3=VejBEk8!b>4aFZT!U*W_yR6yYU>(G#QXO4Dn2jttx~L zuw~BP?k@9uP8{eq#;x)6eze+Zb9YXDZVll$t*Dx$A@_*=^pmHJr?+>ypzF|{#QHUP zo;9txlkEmXL)LrN5m<|fB5YFAU+9yU#|hj8S=N{^7DY~;=M;HKmgN*hL0Q@c#EO!% zDllG66;#;TU}}T$n##Iz&BA?+X*8J9LmE)7nZ_vugrHoTLL{0YLbF;X+dWs=I$Ad; zutsezPe}BWO37G@kYvZz`_= zwv**%DO>K#Z!4>aFbwg706z#CU#k|Vo^>zqR~WDaLRcIXX8f1bTmLVm_!hIhZTzsy zLL|^-O%_GW>zuv&2RwK4IcB4WJh-z_EK&v;&8geKO_=DHSw${0#l zQPq;jR%{mrOiHMIg2cls=HMDPf-(=KCs;X?IK!1EiwxW;_1-8pO%aQ?1<>JtN4$7R1mA+r0J zLQwhN!uacGeUEUdhg1pC=8Kd?%7b^`;lkx*`U?=5kl;d>WU*w>*`%Pv8t^(j%DE$d z@87bZ9VR%3=~sk{*HHN(*>Iaqf0Nn4ga`NUGCthryTu#4{P}{zan0}i*Z(cUyMM)a z_W%(L=v@9RLMx7LzsG3jP5k0A`Dl(?>ysMGcwF+A-+dpYC7TzQ86J+faB+e3gK6{c zYr`vwx~8%QrxZ6XERm)uos~uAvy^$BB2>bm0Y40IRZZ0Epi7^+GK>aCIBN*}@Pv;r z&e2_5peV9-l&=YtqPC4aNuK9q*3$2E@T7;5iotkD7)9)FKVURTdG3W9*rOr)rl7NW zo^*UjVFkXY@q!4cHP+O44op60e|SXQT|hWT=rtBMQYnHUWHL+f10Pov2&wtfH-Cd) z|H^Nm{ourTQkY{d%3!TIQ&2fX%QH3Akpky1oN9p1wvlJQJ}DjiQFVOFdpS-x7~58Q zPJ-w8AUuq54G2}uj-_j3-Ok!z8)vb$U6`*;qv5JWJDF@isj7}a>=dlZvZ5#osDG73!_zJBc&9Rj;}-Db zd#|aav~JqwlV#_&1ypT!U92g@HX0QAfk-H;WqOl zOD-}zHN_?o(Z(w*ovR5t3n)=hqM#VDb@xqHZ+wY(;T(%AKH7mx`s`JPVBtDeC_>*8ssY)_aQ=1yC zHDQ=Em4>OYqKP6)r(?9%1WHoXHI*$WbBj&_b{^itI>o16xX#wYEuy$X7<5s_kVFfp zUd(JV0V}90Lp2!_L=l4{OJyuk(52h$qde960*2X`X6VRzEb1F_$VWVS{;+VB+fT+Dq+JpFMC&aU2RM!qc zq;pOBjXY~BWbr(Oshc$Js%}${YI7n(G3_MtI0?x)hc!(#XkATR8LSmpTVsrEOd_pq zD>Tyr*qN%!)R-3J8elZ1>te^8o-^&F)U~bR*_N;Y7q2D4J{P3? zYDsm~E{eAml5Qu0QlbRy5_4k_qg!LkV~~23JtIm)wTC$T0r}B8%w`p~ z>>`#fFc?nguU!XIu>GSyCC~<&PjLarsLR9DC#(7t!$TrrDB>mN=@#|qK6UMgulzn8 zlQY|S7dyH`HdPeEDZbywKmmg)AJJiPxJoz))Kzx;JJE+p8a9kvTY z&5&{7v)Zjmx-p0Q@3Oi2Ws3Qn>1f8na*wJm*gqJO?%(D4o0plZDOHhEIZF};EG{mv zv9idmH{WLWXhh=prynQ z1?6~1M+el_p`^sNQ?=2~L#iUfn~zZH3UyUe*R0F^pVZqp5DfB6{lJSeb7Rj zwGL;RHodA(gLCaMh_ykX#;DeI`?NB1wpsEP?e&}L>^OkeQdK3!oC4Z0Xj#`N@EcIH zCxCVQsx@NSM?vd^Xjigb7C$wmlv<*MH~|}}j~y0T5L2oZH#fSgz;A+0#TgDu2-&We ziC-FK{E}C5BnX3Z75UDO2t-Yt2e{-sW;P^PidbJ>VLXtO*^ngBEN#9>HQvKGA3t0o z))7};yvVJ$?lE|9pG$SX^5zvD+fUM#(-}-HwuE3AE_x-nt78K8a{dYM!+~Hch#(Z#xYB=J?7k`iUfBa`W zeETlXU%tc-Z|~6wmq8vfnU1;q>ECDNr7pG-7*P>=nk0v$mO~iU#=FF!><9`)|O<<|32*Mtd$p|ML z{m5tQ;eD3YHaOQ)yz~D1Tz&QP6bIY9`;*rR`ioc#f#)^eSkB>uCg}92%7WPQsfr3O zNSF*q?2N`}KR^S<7B~Zb=ySNcgDWcL^OQ2n5T@p(7hghq5>uB=_4F8kJd%OvPBrbP zoMt;g6bgiT1gwrf?GqNsKgtE(K8ALcNGXBS4(${H>g2t9-2PeP zHM+36K9ityTusUojhS-}XBF1fZI#wkZpT*Arf%gIuHm+hHE7P+NB8_%%smFJ6T4z5 z+jj2sXVF%sC+jusFaqJ)>uMD3Bv75MIvqQU3VFO@AU+Yj*e|!jqH4ISazNbcQ_inZ zoA;TFQx-N~Mg%dHkeI`t5=cw07on?t3R6-}W+X|UmFq8&jVF}#J@((c&(_@mCb`IS zU;iCeuDwi^4M>L%I2@0;a`Q#5UA@fi)_r!~{%eG~N0}aR`PJWGWub>jOU%O|wUKl- zu0!ZCFQ-UrDE9A>D2F+GkM7bYa^*6!y$6&gLc|f7o%8&S7udabi^2-x)fc&Negl7T z6E9h44nAu*8XWQN_rFhfp-(=l*&mM3THy=BTMr)M>5x2|(@i?yaXXG`xuy?JZ~YmQojXK<&-if0#n1gAM|(e^_~5V6mp+Z3^bn;Z zOQ+O9mw0KF^EaMjt`auRRUE$i$Gr5L|B#zs_!6`6fWmq#Ug)xW_upX-clpkr{9jyL zy@p(J0KG)w6QtE_+OTO7XjFGa=a^d1dCW8?s7S!4&5Q4RZF1Zod$$*&%S=_urmCup08CEIk+ETYI zoREqz^qYhp9kQ|B=l-1!h?jEwD4>{*$!d?4wd>q}|9wo@Yorebq-%BtaSmHs3=*$( zb}+_JS0!aJr?;@eg6~neOVoZuiGiYGG8&=v0@Ex*DUGa4gi>62{w0=|m#OOd^vvI~ zPsg#VkAp$eR>?Dyzh=);X#d0+_4v9L@kEe%b}vftNDTVZtZu|dY|x6>nKF78Ne%!S1@r=vIpYyTDnmC>?wm>6H?YAHI$UA(;wHt> zE(agHMtC$Ja}Rm@ul{cq&OOKC<wzS z?{)c&e|{A!EK&v}YZqABynqm}cjqClhK?7IP3Bbnk|6AmM2mP@Vx8jP*83dY-y*Lo z!lc8&!#%98spoTwA|+m2Zq_l@E|JYO)ojA-V3#4ZnW8l;^rOaG%<~j^Riga>*G{_xKE^aH z;&htw;`7flDDP7jIWCH+%aSCCDblRjwaW{TPzb|UzVcPH))>>+PD>$9T9F!ywDJ+o z=(K9F?ZJ0yIU`Pwx}V#WJnew{aJ%@6J1~zcB`HtI{bS%dmSG(8b4m&D{nl5k1t)g~ z3|n#RY5bf!;k}&WOl5k^xv5qxs~(w(3gJHTHEC|gwN>ot&fu@Y$HxM!UxYpKqdbPi z)fGir6DdU*O2&KlIDg~U8E1}ZC5cUjFQ&L8CR#X$%?^nCh@f|o{^qL;@BfT*FMONf zogdNbIMQm7qkX~A;gF>(uduM@<7C3_tsmoiAw?|^?uhjp8*IJ)XV`4Ua6Um;g)}?( zk)s+9>4Z7soxeehM-VOZ#XtCG-2chS5j*!DqJx0zmo71zPnnLUtX#N2QKS^s zZ)632NaY%CMz*?{AWE=B|^a!%Y zRo3ald(;i|1PM=pzrFnUas8@*)i1xoLQ;lc`Ou*c!;d#H`8L|IBc*x~t? z*Eo3VP4*8wifO^ZN}rk@%a?92czBPM^VhJYLDZU~VUF9s$E%-O<|tc7RT;CrF|NAJ zVCRS+USK}AI0Jd{CUrVT7deYpE@Pdenw1nsISc2%#B8?1{?^Y}zHyF3<&={>&R@R9 zbecgZaNP^+zWWyU@9d$y1V552ELO~C8MV>u&q_qHPS8J(knJ?8atP_OapeWFbc*l$ z)Op_I2HJv$54X8+?jll1jt++`udkEk83=)`D?IICJ;``7qt{!Y(>EM!J*27~ouwYa z3DW6=d07y~33=88PwWr&@uHZnuSo(y<}`ulQIr``6k|<=FBG;YG0vdEm~OX&Gc}=B zc&6mNci+QbT_cWrO#*dQkxz#dMI(Y-Sne_$S6sbv6H}MW)9DHMD~|1^NDE}g+x_lrGRx_qXrF;-e;kZXteQ_2uAk0{J(b8mA)!wbV$O5&E>QC&X56`lpaM}W+>Z6$vXSkLkyoh9yf5F1M@1SOq|OC0P!#0v`M zM|)iU#vd{oO_AyXi=8>6=|0(LLf0LvExdJQGtBV6e7wSV#7F!y%vhr=0@Nrg*lJT379K~*^B`IH2~JTFegk$}^V*Z=Y_IDhUM zx|1*)r_}kJ^^4E5u(HDX%`xeC#Llg^Nfs8+zE8*Z*x%VE^aHZ_l%v^<&;R;2*nRIk zjt-9Sf`qu&MO77bnKMf>qJ=(5+`$z&2jdyNejiiiR9VTC5YP9R&*x}im=2G?8W55= z^szD`=p;z#sPh_Em+T!J5Uj3XJr5}YCX*??-vqEqQ{$B4Xqe-LF;_M>DCRS4m7fF@ z$TJfsbwchoK&Dg^eWsK~Slg_32#IUCG}}r5)FT0#?rgKzI5->w(lb|4?y+^Ak2i4? zk54+EQt~~`wD4IbnP+{~kpgF*AlH!gr0o=Es=fwOZM)iYnp|{p*%{u<*a{{6zXzM#bij~VyfNSp6= zAxipmy_ZOLU+3aWuW%E^2nb(&lxd#TCrCRkAmK!fZUpILBl-r?;^uNvPfr8U+nlyyiaLDV>_PVAhW5Y1O(aQY00v_^j7L(*d~ z&kPQy!1Z_w^=xGRnfpHj03X#)JZmfZVJBYM>>i4z4G_+n8=hHHdc4IIkHGwy`?gqD zB8C6=fc23d#-QeRIC}qQnBsu_d%M(bg@f$@uYU9Es5+&ZjOd>4vU>R%&qZB?Ib?Cs zGCO*}=)qg4r59Pb(!uX-u)lkYe7_)BGkBiHMIqKsnP(32*HX0SJ5 z=V(B;mw+&&vyA7Te~$AvzJx?I6EG=AB9GB%GhA9&!tZs+XBk+_^5O~zjWv$m(h8nXRGucE z4k@dWu+t^!c1VW>eHBRyT-ZpXn?|2#Df{ zDxXtT4fj=BOYJP1moMR@qpGSCrM9(=x45w444>0>dGa)o=&_pVLzR%TO?r#_C{Q`; zM=d@Iq(0tdkE{WGBp24!UG8bE=+6Vwr#<-7*TOv!xWps$)=8+v8Q?n`aQd|8_p1O} zznqva(Zm96zxjQ7N3UV?A?fxWb9I@O7q8RJ=BU6xk)eFa@ZLU~mtSD!a;mDJm=?@u z1^L_%E%sULuTrFYEcGJ9^EWZ0Ee3CYhr$GCPcb;$11rz!oF+-g+J9Uv2^( zrNEP}v3n^cgYjKPGw4|eVvF_+{>4l5`iqS2?V#rONw?nOogdwUK;ru${lz}R`HVQ~ zQOk_c=#Vg3YK-Kl5tc@SBOqK}V=x>NL=iGCxVW;w>c$%H-{0eMsZ z)VX7h#1;kV{Vl9kIH{2ig2gqIR`hkm`ne1Ax?QHjA>l%Ywewd=)0CpF@SNqxul<0f z3B+> z)n+8TsvM&lRGpGUQ7bz=;)`)^o>mijcE$T^%a;B?cbAle{V*?x*+EosBwS=*TD z9T!*P$*D`uIgSTpuD$Z3*ZbR%H9w!Yw~rS#CvBH_hBcNG&guyO_F=#~2J+(phC6MI zg*$BrKl;u-^cpsxxo% ze)U^u*Fi0;Go5c!Tgl4WIkpD7EG;kd@a{dj-9EUAAWZQ57-=k~{oh;Bke*t3SSOiP zH4ldq_Gbk`XKSQp=cn@dj&~i+EmvmL5B|-o?##=v?>`YfBl0sj#_f zf-9}ZcW>o?lwE-n9o)sW%v(90g9X731ll&_c62Y5qyvt(8XHXW5 zvw}oOtb@#C%pTrB`xO{VR%j|TVKri1c>LR2cbOE8QoEK4shgDG#+3kUT~nHx%2YU8 z;iSOVK3P$7>C$FnmS=0E6wL(BSU@!?)S@A&om7t;#0?NBgwRN-&+HC1i@U9lN+TW> z&Fu<49CgoeYK}OgHF}Cl{NuG%#u z+xuAAXFl9#|NVFAbvpQ(r`O0*2#lyvWB( z*68*X8&?*YO%HhQ^&jKQK9_&(cewPq-^BAHDmUWr{s0;DC~AZ5EJBbFMV-d}wi1|9 zqHTtA9*8O3q(asMa*o)!w?pspHP)_PW^hy>J0a^!D^zvOV34x4b;O11uaMP(d^#eX zj!CCu^689k|K9JC6&cRe6s|x3l~vRZjJ4!NL7qEG9pd>uVHi@^^~p4=s2fhJGUnt> zU0BDwt{WH3+TbCmrWw<$BGWz-1jC}D5Skp#tO}V`2}TF_+VOBO=k?nMXg|i68eb|p zK}08v8@WSe(0)u^<+!>)iH4_=N>bDnSy`}g{yf4N=Ho*ulYWR~KDL)R`+L#)g-fjv zo;nFdILo`7I9)!$R_0mu2A@UpaJ*Rkq5GCk_SiZ}qdpUT^|+PIDvayV_4jp?0%WH(zQ6An$ zXiXpmD)HFfIwVU1hNB9h9QiC|dvC9CNEqz#nJ<5v>o0$kVzN&q<;j%LIl=1c5|vN{ z76R>^jGv8lC=|w8&=uu8W%Ie`*?D-saiVn1{-DD$OjCpuWsdLA{6?nxlA#^T2@bzLBo#8xGy zZtRJzb5upi`q~PMOFfkD;d_g%(9N&0!`0Y>kD^v3E z4%N;bI-OMtWw7~xV!ThSB94X?u676wU1>Nf3u>#0LyxEvG8`UY>H^>Qo8%T_aTYw^ z=PTd%3a|g*wPtg`I;0aQrKzeK8AviyBdp`Cci$lneXy3OHCC&I###uKhqMywg}n5+ zFQRGbH{oJXDP5vE2hDeMYE*q zBzOwXROHrSrJ$Zy2v3n`IZA0>e);A0d5Xq2Nt}vB&xUj!e{F0~e6$YHGH3wmtQBwT zba}GuEaelcrk}Tp^GwyqV<33e5b*yme(UV_kM9nC+~@XjTi}!7>J!ATj{>=bPXH(Q zO93o_Kqia0xMub0HAaVBs&vHBgYWUvzxh*i?}ymPdT%!F2;0%8JX|Us~4FJ#srDSo!f^b ziR1d`ze-u8EUavRoiTa%CN>>WqzCvx!osC%c*Tr-60`T#4!yo+!?%o+9{2B!N%M-N z6QgTET4o3*$npxMX4JI=8JtYcbQKWAU0mxzY7t0n5yF5{l-3f^xJ<6EEO3;T_*ybI zH9~rXEx}q+VjcK_&%6dfy;1L;mQQ9`;#P#^BIx*E~zfO08*vP?JfDP{wVsPPDqRmEic4%Cgeb+-EsX1Y(< zO;FJid32t6tr<;A{9X@R7F3mCJes1dWwiA^>F(Q14j)qFHAU;~T@)p0I^)Z~_GPrz zr@4IA5_DqXI6>Ja0l2@kL|Rvr&f=`07bs+2pEy%GTcK@~GfK~xYc_(@-q(*pQ(;}+lyl7=M%b ze4FARrS=8M`ZYFR>T}Hr^3graJi-&2sMDn?9j@5LP7krRBno}fqkWc_*Qt$9T`2-p zAhg2wHNsT{(y+3&OtO3#KTg@xcBC53KQYt4F*R?NKqh7&8$f2bh;c3=15A0JGa>O=5&_V@S@)$ z2)alqFa}Ir6Gbtd-U0^)M~#u1bEMOZLY5?9#AIG@u(yX!Iw++n5De!PzUNViR*+d* zw9tgILgGkkhcObr4JWAEGh&3sN&&V}yBlf2f~}hrYF8VibQD-3e1z73!Biz)9OC9B z1OZj;2$W);Wz?-RrVawG-Mo$;c*wSz64HIh9aOfl=FJvBjP_!LA0j;uS}mN=x@jx5 zZYF~A%wn`_^;jQKww#Jmj;G}Eq)!h>VFP;@BKko7K;oWC( z;^5Z=dsNuEpv+RL`2^8MZ5aolAK>-Yu*QAlYxN|sI@?yB{ab4aqzZmD084&^kM^^k zDTD*(`Do#AVnlLbmC4*8gr+Jo%5s2bHnG75qj5>xzrf(|7N#mmyb)D8qpB_4c!8|Q znU7{De+wZzOi?jQ3u3E>99Uc^nN3U5y$Mm@5c(Q37*eim5I?_(@jJ}+@8AW! zW-`VAAq)$P%iR5|?;^%SE^T({A57Vr4~V-R;^l_pB^ zw5iOhiBeY@0hC3_!Tuh?NnCAlN)UNblV~km6Q*gJy}!5@QRg|LHVCN@wZXcA#g$d& zS%$NY(iG&Q8l^mB5@P2CK^U}WSjBvnqNy=e3BJ!_e~IBNCGK{R*^F9+BubJwM{OL+ z)d;}vbei}oQBzSNObIx$s>V5Z{>2*vp+qRqtp-dXn~XixSnX;*!jBUCD8}<6l=ktw zpovb`K3e-t9-gP0oIcgq$k?{3c|7RgSr7I{4nWzo%4e5u6JNLrGDg_C35G?US-?IM{`$8d!_OW(R;VVJ z*3{J55b`ngc!zTQkomzqigXKS9A%OJf9<{3k7ZeQ=J(s?*lWXPMEc4yT~%Ghu6Atp z^b8+nz@Y{jNu&&hzyNyFiv;R#;6I>uJxLGJn*afWAt^#LpvI6On_cauP1&qUZ^B=D z+%|gHHzFeqDJ5sW_doI4 z@BI;xw|f(ifdjTnu9Zh5CH{bx*TDgCfp<0HOBk3wFzO)(4*p2e0v@_SK!N< z?GHZ0-Q6HvzKqOs);|1%Vme{&!mE7#*`t3q-PlOQFAz5%nuJKE1)ljdjjnIY-_~sHQRPHWXFD;_?cM z=lXP8ZPGjsS9mwIjs#I0YB=w{_YJP!`hSsDp#&7xg!+yXC@q45f^-ZATL`JpDh}Ky z88WsTpMA{g+!7O|u}+Xg0yWbW7s6B24LDCD4IQ0elq5=0G>So4fK*JUQv?yNZn$5S z%qIzXnqo!7XgZ~78nP^-s)lGOsBGYa*|Neb!?|;3g1Uk{+z||2z9egr(o2;H+{pZz(;FLL&~e?CoO5Jp zhD;*TPK$QhMkFC?#2*v5guo-A9>H{z^4`bPJD*bxZUs+lCGplGn~HKe#2IKBgKZj` zX@L-)R+?hVFs^gsmw(D@|LDJ@k$z9V-TB>_vp7; z#F1rtyGHj{nd}T{b>4G6%l!k%5%)#~ z=Tpt%xkbhw?%+hog5oryGLS?$bv>eSj&FVYJ(5@l7ilT>$;b$zI45g$NLwA^Btu0h zahwM8&Y20P(7W|26`DD_EcSiwHpihPJQ)By)y7rQoBx(^S;BZiBt89Z&<|^;U3A>W zH4WApgbE&ij^LeGlr?FmM^O%mY(XY^+};|q`5*ru*8cThFs)mRhC5uld5f*#kgBRe z_qQ?VDB|LUS9tfk-{qa({tl~`FOc=Rq;Uo+xamk2vPdf($_i|`jamB@RNX2McF&W%qc=uym+$M=)vTh%# z(*TT~;DtETs6P=Fc<{bHvShR?NhpNavvCuCw${`am|;DS8kX<^C%f2q1-UYhy|Y2o z&#Kzq(wkprbnll`*KVTgW%Bupl&(j8@25oG(O+Gr(`hqa z+hXh1E#@zsWpiT#zq5lfQ*6j?Q)BHw9V=_|2ur5NERxhI40Jb(Pm9! zBs?)NnXC8rm&yIaR*>8Wx z?99pn|MMUJkKA3mPcb!YZftS$`VETl1UH#d)rLj}KmrT4L5c#W6QU?$Tm`+UG)bsy zgA&kJf_$#S_FxC$J*91E>M_%@W?W9lS}jzPVvHkAQ*aioBg(QSOA_#&&5>p2vs*aV z5Icc%Qmit14u=n6u~ zy#>9CImhinJ&FPTs0}r_{2j(O-$$1p;WA0mSt3#j-!#aoqMS?sL7Hb&<%B4TuwJ3+ z35)#&oQR1`#pX2Q<88%H8avaH#tT}l7Eu%h!_*lM?t^O|@ym}s!2Iw3 z8z{j$@4m}F{ewT`x4!!=7M2zvN}(C!);?qM>7Qc8TWqb}CCgH*_he~;sV#Q0!*pse zUeW3GnGV+RH7J#!w4~F@sOk!145O_rObuQtG#2Sf*6&=SJ%14!$5<~&+a9fhxrfxz zvF`gPQ9>TqEj>K{_{G(*PRJASN52R-5RIU`^%I13)W%S`Aq!_OQo0x&&$IpOzvR7t z^3U;cM%Ip~oaW|7pR!#}m|KX*&(6_ayo@M^)Ro0&8J%-WLS9F_;Qmwzx+2?-KW3ULbT>Eo7>#|(T^D28`636b!uJFo?BvZ`Av3) z1-CzVpH^p%cBhM}*7*F|gsQT56|=Rz#n~&Xs8|ze9mtrwx=phpbTrf87Fr=u^tx@@ z-8NC25hXcMoRY*DLPcSRRGOw~7!HTry?vMK*RM0!y31&No#|kRGlpU^MF@!F6k{Ee z;S?bfq?33QDwg!J7AlUB-ZP(PY!?-^F_@}E6b0Tx*;ry31&}NZIEjxnwJ``ON#cY& z?=apfc=sD`)9cL<#}ToP5Go=~JG6TXWUW3))(Y0=NluogBzZn7rptXto_(x5aRkx& zm|6XCHcxLAt*`%Q$kL`jICs%oZX$@@S45r6%|zva@|^Zbi{ z`A1xuD_P_^v6@h9k7=4INfc2QQ}T8fYXnjmifK(%cvK=7kGHU1(NK}MIy2z$)MdkH zr^FbGu{F{q;4I@&!{)6|D2s+xe-0Zgt%;Kqon%NakWr8sdhnUZS@tE5aM5=ASW)5- zCCu$LOT?juffw$Xxm?1Zuo~!{c|2+3n7O2w=}`~g|G&8N^Z&rqNM8S)f6UMS@?TL` z6IL(2i8I?^75VacoN@f>-~8XymE^7Oe}}pD6wz5hU;HjrQBmyN=f*F7%$f67Xe}?0 zrX6fCr71Sq+PXz|@jav)U`Ds-%$-N%Jw}5as_B$gCu44*2k9BccW!a_S3jWwvUVF7 zk|gs)d4f!WN8tFz4aRbwzy71~5@-a@Skf#a&T>YRB8<%lNgTx( zW7t@~i`O;3_s@QpEJ;x^CTX?l&#%zwEs?c5L`h1Lw@I_?L49i`AM-?eu0x!nlVn+s z&-@JyDgMUa5UsyYwSAXrv_`kv4TIg020U8EIOC}%YozTC)+?sNO>myO#YH}vo+0ga zsYesMcT`2e_U0CoX~VQC85bj(qNJEkDW(&us=`ZVoI62TmJ~%nS(Q|#0WX+uDgM#d zSNP6beU|1lNgV2dd6v#xq&>z~6r(Ync9(j$Q>+qCgY0fq{7;8OB>VR zwdCscHD3L}e?e>E6vduxLf!jgK~Qml80#>?$I=k z=TO7?!T?J=BK?|P{Y#|XW^nUYY<|AM*6n+^PDFR^40R+ahnx8J3M~O{G+_PX+hpg? zqqxEOZ~lO?c1$aet0p8>O)(j>d|`>C-=ZE4i095@C!3Hhvh~?jgme^J1ETJEWTr`b zZB}2oz+~+j^`s=~USK*L(VJ_redijT943{ewXjMx*u-OLiYcJDy}7~K-4TEKr~i&O z-nhu(g;!a=_y%zjqoW8tJHBZh5$PlVfC@^RQb!;(QfqXQ5k;Ycrs5PW!t=CLI0;e* z3E?P;P;s<3!tr3&3seV$nt9s=r1Uu3UMAR(p~D(pmcRtK_XVd9P2BreU|= z<6*f+j?o-vfcLr9O=qeE_U2EKcm52fQ>?EL&SD!-)}SJR?=GOC3_Gc4iUH0Uiqi4J zyDLo66_PZ?Ova(W-878GW9rIMRTa~^!qx?*t{4mkjEX7Mbc!=3xEx7=wT?+qGA$>V zvYydY;9NiBAHUt@tv7ls_cL0#X1Fs%s~lq+;v^2*WY-2V9*da#Db1nu+h zlGc)YcW>j`2|H_3+KYYU@HR=BbM4wyCL4Eo|A*WBSO3Ewv$1`Hubq399lL-jC#f%afOIBG0{9NZyD`OsC^D9!))BA9BeaL6BN@4y?5S*W(aYcy10$6N6ekS!f>$0 z`0i))vz*snzra=Qeq~CxVuDx(L;DFNn*Oa4(BhPc_0HU0IL`bcGwvX`PmPD!nKb- z-gxtM<`!0HciJRbj*i7%hwpI< z_+iNu9#6hJX07zNHPvuTv51S`09Uf}xBn+|XXgD*plQa)uh0A$*3u*8xw}aBaLeebyX3? zI&4UgF$Gp=8~Lx1TUvT3MOk|Y^v z24mA;EX1)!>4<37tuwa4(IAw-ScAtC#VM^$k0^-TLsn$oRA1_@lJv_GGY!{rmFEu&^S*$ zoev*FH{ut^LM#pK;0PPL_HS#4?gamP+S*#>Zu1IVy0#G3|OcBH%Ou$#%a#H_C3=1GYqc2Ph$;(opsJ#K8v(NZhU^7IO>sSf{jmq z!RED3*xnj&=HlyY{_I0Ky*|Vl#pXSldP3e#Sy<@cyd+wB74N}B5ewZm&Ey*G&N79! zcrvDq=f?HB)UF}Q+kF4`zeAj)WQoTc&%!HbafQRmoXUVtGK2-|Bcjd{X&QJ&yG9G) z7#9c7Q8S7_oRQ=$bdt}C?J?1eJgId!hUr)nrx{VCiQ{PIGNbl5P7jn2W?*zk8R6g; zM`(MCJ;T!7BC7Wefk!JvnkHm>W@x-p885K0v;(Vay zdGABR#D>9iTQ`BrhN75O)D4tnN!56!;}WGa^x|c7-Xm}K=*^!Y?{sEa)@)=dii5K2 z-cf$nY3Jzq$)i55-Az#(a^~10n$C*w&&rU0F0+JU&s_3&-NFZw`hmH-{pbG+{nazv zx^^4uCHHQ9LeyPFM=hclR#&c2PS@BONmQJ(y|IDR4d>o|k8Ux-H89z_&-rh^jy0ZX zT`{+KhO#Khddu9q{|UDHDxypo-uMZvxjrn;(>?!v;<*Jj?|w$VlM!Xh*y$Rhwd<%T zChND*_y092sfaKBA>KN=|KKe~+uQ71`;bH{2BZ75e9SnG5MrhSCFP!Crke4Lq*Nqn zizLm7(-t~PkSYqcS2{w?KuxO%5eMsVCG~^O?Ed2Afr+={AGwYi%{a_udi)OS9v-ps zPsc!i=5oR#*4N&3*!R7geZS936d^38m6Lt*56CWm2Yc&%*!mRfEz`j|NwGncwn0b4 zQObo@=m_7~CXjNO&ThV4>nuqUXQ*B{VoC2PM%#OmLUGj)t=NGQF>lyy*>6#^v% zP6|YA7zx2ATMA)HE_WPVkz;KbpGwl0x-obOGIA&jP;;%s&s{{ zJx>(JWUVe~)V?)b5K#vU>yNBaKic7Ax2Y0nI1keyLQekd`ZQlyhIQm_DI}s9 zp^DGh`uKtNr{aXiDHe8WEk?*aVV}! ziHc&n|2wYo!jm$rCv_b66HomS{|7=C0QJk zrxD<2nkLMf0zwIp0^P_e7@h6a}E#7eWn`Xa2E2&8fI9^>dOVJ z!}u$X(Lof!^QV0P02zBpL_t*hE`o>>qUA-1=h^(xpHnvpk#K0$aC>bFTS1g`zzE`g zMij@4KK~S1C*1wTzawd7Bw0d#afur@?^8_${oX2*$(Z2>KO~AfSiOYS6XxG|lg|0q zNIM-?&n|H0?QbGvO1-g3B13Vqcj+~hH>ABehC3Fg6xOeB?dpAOrMUXDUlPSjti1jf zILY9~`;041BU+@bJQT;H1RcdeawUprb?3-C^JIC8D9zDvii%UBI725Haheh(>E6)l zt^nTSG9|HZSocx#!TVGAgI{7F06i>`^6>MYoHZQ=y`#QAai{Q*gv*hSiHDCb4;B6o z|Lp$fi!f*{y})0)mBMnkf8i$b@Q4Vm%QZ@2fB#XybIh~nv7RG@!xL<{ga>qlTzV7PT0+|?&|po0Egf>Elitb`&Yo@2jY~Fe zU1PL8VN%s7B}k(bYaG_p!31{pd#n%hesxii(2!zj%8H$>Av-%`D$^i@Lj%SMCPf8y zOpc?d>u{`{xnw&pao&gem#L7FK!wo>mG`VobCQL#^p{uY^p;sY|0+voFO#&oD5Zh0 zDQX>~qhznlus=ihM{b6PH%WgWTM+~qaCkU7dyu$28(_UKJ*?vtQ-ybdvr}wfuKopv zHgU3q^bv#mS82*I7gsxM-uV=d=K5!!f*G;&+UsyYX8X<>ubcu^4_=K zW-{1d`OR-&`W*%vo2=iv4$kwf@1BL9e!$Q~EL{FNvDu*A>#%Wio$q|_KSw2w!Ka@x z*PUZzmne!63$K5lzW9utG9p{NgsCLo`LDl0_uNHnd5=l6MPWb+O}CSQ3KWDaZPQ&m zOWIu|PP5Pzj6=~~Xnjzc_m~ublN73-bq?=YU;o4$sV}i@emGn8Sj5t6xVcyGTc08~ zKE#b~A#Fu79a0q&iptPV8s50v;@(!p+ExRNqu41ZjmA0|H0zbXdOtIQ6)3G46b0Mc zJB-I82E!3WRf4q$8T74;cR1T1s2F)jWGLP@reac9+IdXZ$8^xRL{k1=gXD)t?{_+LlEDth3GIV^Ud{7sC-1UCEc9%caXZEOd{-tMF$6as_GAxg9 z5hP34+M<-_=Eonib@L{l{QMWZ{q`kxuKyjI_wG{3jMv_MoBJRAg4$Y=dW%XpY6Hd> z{OsTV8J}O<;&=a>KPF#TrV$<=YiRCr;lerYT)Re^w^@4SB7gfA|Cae~i+bZT&R=?! zIGtl!)#U9Cy>lrWVS2zx)h~~8eEZFb zeMcP;Ms|hNf%Yf`GM~rW3^CotRqL2)gm1=7hwIp;Afm#Lwt}*P^k^KuE*TF8jD{16 zVnSI|n5L$&;Oi1m7f5IE#$g%*Zblaof%w^&nv8;_)X_~Pc`Qj{fffQS6&^ul9gP&! zMsa^C*s&S;!YXGkU81+R$kMsjIrqxf=`XH?nw8QBWRU&Q5*fuPrDtlSYLC~qmt8$3 zn?7hvD`w>jaY)CXeH~=6*O(LX>2oCK>o3=;-lIS@2$>VV`3K-UZ@fCBY8>BF73I(W zSCY;WJ$Z(uxBdxwVVV55V(M|p^`Ya9Z~r#dNm{XEZs}E4-ugY9NYVW_SU&e1q|#KQ zA+9R<{crrY3~u}t>p%J{zIACCuO%w)qxvi4_7<(Q&#ezWVEyXfqUX=Da_+lymiuI9 z&NE*Qh<^TK8W}O)Utv7H#>emfg7x(g@BQE%q%J6IOn>zoTzLB*(wScjTJt(WD3E(r z>_?amcz>kE*pn=*P68^&;nw_Sfz*?(l||r@#X8*hDRT3dcsImOCb+7?)dgle1ye&g zqLo_mwxJW3l#Rzu8~RB~s&p`r)hVO0##_zVIYqD4!JCRn5wSgq7?)jc-nqxtWJF^f zG!0oKNHxs0QRiwha8EJ5gm$}|iohV_wTDB3JuSYmN`g}J3w7S3Ftzqm?!Zjm@` zg^uN}0f@)L%xWBgc3`b#=ho*` zqixzNuaVE4A$B!RNmSlN?%9=#6TRP)0M?^^{uFeckkLPm*CpJHfa_tr1^3>^Z+(Pl z#^4OD*r6`R&^wFw5gVWUoYC4%WSrtu&bVqoNj5j8+`TvE-e$qZNRwn8+U=ZiX^=v5 z>3p9&i?P-RkJuz*dobdcA6(_?t@}*t1|ft3lHY`@OW}|)x^D!j|I`=F^QjCcRFdu?TgJ& zj^Qaw>Hzm!3wwaW(BbF4z-q21wR#XUkpVVF?Q39Fl&adhjV2MDFnE}?Wg!Qpa zS@%BA2Nz3-FK4|8#EZ$Wo~Fn4+XA28V-U}OuVrkoa3 zjYlOhWz#SkluRnms4V#G=7eA0ED>7qjn~hx(C?tEA&wMP?b+BKV7(!4#k5kz`QM#rha zJ#WxDVJ?p!--28J0m|EWF#(z2okG}cC^o69hPrSRqtC%AOf#mKOfe?GYk{qU>O$NK z%=b)aWIH0$4H1sI?HINlz4l55Oi zak%Gp!h7QLW(Kd@R}r`WBfeTgP~vScfR&=anjL&Gq8M4ml|#e{Qh1tTinS>slX&Z} zkt7ldS4=U^hsgyMVWdIph~8X_GXuxUa*L&<7QKE-mL({^E7c^!Y@io-8Dm|6uS;-2 zzdh0^UQ2|C@!sNvLn=dEPG}m36P~;k;Y-W#*3S@mizILHfamW}#7GntgObhc*Y4`K z&-ieDf3ELlpO4(Pq3+(9@{s0%pAAwAP%n1EwcQ7ZzDKvqU?~QOcump{6PY#(J72fP_>XT-L%` zgEJN-EKZ0(yKo9mgp4Dcv0$c@jlmliXb-Apvhg{?&CB$3jQ0*}4L)(iBJc&RwFqYN z$ihF8MsqL|cE`G;kIiL8{3QU^bGSK9eq0iVX#Wo$cYDK?FBW_b0Iq-F>vG_xf3Ouj zQh@GoJ?P6i3Y}CJ{bkJVo^E~4ybjCzu=x|D*#V`&)cD2&O&Dgb46f8vP6iQ0A@R=9 zlm_+;XFai&XyK@wMCLh>);McvnmRaW$Iz@-^!hzkSC{B^=1H@JNX~}ZmB->py&!WY zsEp2R)SL)PCSJx!@32mW%xA_I(~-nAp*}@pkU%6PqxI|D{owELPS81Xkra=U0wWbl zC?e_bw#3T>LxOxvgXF;mCXcwn?g1@Ad@-)jCju-_6R7o1ag&{7I^REqc$?sOjOoLs zkVo$(JV=@S!_(*DIo#AQ8myjr$oM78fS>C%@)AUYw__On9AUP@!_EO3Aq<`dUwUW^ zjTJZ|kTEiX+Inj1XP%1!?}P1GWjw|wXytL%QB@Y_Ku0CzxL|GD@yZ)*7MD7-+OvUo z6>PPfX^_Se#W5mop%RO$8|tzEYl!1GNLxFHYnpIevj!;~2uBpn=m|*5szEyN^^~Lc=!@(ST+>y{K>jtdlD(m zJ$X3#FmOB~<2m4|b_Dnwx!Ct}#P(fm|ENOKqjvq5{CIj)2k)!Y06C6J%Tv{`JTUwO zQLW*V+Mo}%)6 zbjNUG=y@|uh$Ds43Z-VVdq&}06EYQV!7H>iG}5DEjkPmjMH8-pnr)y?gc_W*8l^1G zIkYw?D-m_j>JqMII^Loz$LJ*ZLYlgs%}ges6gY$M7Ucw9c)V7JD$fV$IJ?(AG$?~G zrRR%XQ~C>CfKSmmd=$s(I7gc2!3O`T)zD5_ApfdlQ_m;U@=y+7{CPlu((c>DEZ&t! z9L_1MwOAXxB860VVX(L$mL~+(JA4yHYus#U8)E^3R1Jj@+}Mh_?at7&Yt~1S!MGvs zOi;2NK8r}BeTuaT>l;K}fS7@rRG6j-et`mv@q4;kLMn_6>ao_^2PX^{#2B@7Bw8U{ zLtRWL<8g4m_AaP2$RIx>#RF-WN0Ggcu5J1+Z9Sd5hUJ5Pw>!i*dKzF5htkj|U4R2e zxG(9b^|FG~aqB%VbC&g_v5sf`T)l8mZU>G2#v@D(%x-w=z-L%jA)UiC4NYw@-eH8t z6AVfn3S%v%4pPUaX#yEj3SySE z?j|BK79WMqU?{ymxR(xe3B}ZU2+tR(vhX4R@Ns0+X9g|jpj-!61)MTX&>fzM=ixwkjj>~ltuVI48XqVJ)?=N+ z)+NRmjBWNcUxJR6caEY=xHIr<$6Y$TMcVxy^JgxxuyUDpt4mc)*{bf-t_QS~MfwI| z8f2Ox(i{+Y>yV})b}`P>7^gr+NYTuGpF>I)x|UJ!z|_i;${HDK{LoT*hk*dRjUl#n zmVx;LgzlqhDLh^t>Py`4P6SwDHq$5exuiH}j?8w%V_%0|BGO~i(A|r(-@^Rwf9~{X zDdWd2mM<%FdfvbDQH=TL^4hpSH*kP$@J$7E$dLR@r^#4@wT{LZ>SkAO-Qir&ud1pF zAw@8nwV;FqtuS7)GnU-g)J%1c{=z)%#U&QczsB;}EA;yFNS$K6pf0X3E(VOJLv*=L zOYG3fEJ|xUGe>L`-Uez!Bx9^J7+HaB5O{=-K{~u_5Jn-iM`sC99U)ysX(}cv!dizn zCKT=QVZ=;$oHs}x;j!!*l{j(q{VVn??T?zuJZ=p;{^9}a$TzZ2F2X%xZ0Av2q$g>R z|9z@2y=XxAP2;ycYvZ5UAFdh$Z z&4ARbqr?bdreHnZfF?pHiBJ;PgiSthrve+pD}~fSpIvH!F%=ra6ho;~91`mV-tF4K z&77Ce;AJ=z?h<#8v8KZFzPz;Ixfb0Y1zv{-mUsW~-{gUv<0vm4AA=mH@lbjF;cP)l zWZVOhEON;X`IV(-jXl>WX?iWjYuzosRLvh^8#@Zh~tH@Fm`sxTYp@CA#t` zt5I6voMTv>XQU&94lYee+966iL`fSJ1>@d0O=m_Y!R6WW1QXnsB)j;+Xbtiyl?J`H zrvUZbK zWb=KDaWr*BUDPyXAe5TA!j?6zsj2EIr7<|$;GD&JLlZk>7SoPnk|ZX}GO~7?tkofF zwF602&7@{{ypX?;@|nR(d=&xf?*1(z)i$mPV9^*T%7)3b zq$w+$6L_hp(HN^J8cpe9Y&=IYf0pI5mzXZugZ$ z9z|^4o!Jl~SPUZsQ6z}t7I`b5DeU=R+-hy;R#rCHgf$Jun83@Lxt2=l&`J{}5lNPi zrYQ*ZK&@dnvw8&BODO{t>9k5d>F*#bIQqMY8N zt}06FDa(ekbQqh^=o~|WaWR!lu{tMi&9gXvj_%?j?YTwrZl5gA$?_bbVvq-2kM}E3 zJW9glNm^lt>q%bjGR+0C*2J-b%mW$wO>G@+Msl3l(TmyVCkTM`nCmLUexJdYr6+Gr z0qZoL2FPBX?CYsiLw4`Od>NL%i?Z{$oo#$wql`t@9%m&^Xtd4{afiiLkGS0>>9j~& zUGh95$wRk~1InH9;qkGjq?#PJbN<~oIt8rL_>Bdy%m)m zc!EOgy>IzaU)^W9b^S4qqR$Fgfo~Z-H^4frVV%Yc4EfxF>)0wEN7g^&!~Z{fIqCfo z@B1;YzyEzaMp5>plHxBMj9s6{=k?5Bbudl=>omR~;Cg3VPUAGb;5Y@W(>RUOI0dZJIE~XdjZ?rnjng=d-+(ZufOQ(D zaT;G;usQ{-(>RUOI6V@c#%Y|!X*}=j>J+d}<1|j=D+5*l|349*Rb7Rqhc5x3H++72~-QAtw?(PmjgS)%CCb+x1Zr@5D*YZQj(&|5D<{`|E{ZnF#pa`j?8HP3OIYoA5IVu z2u$!=7usEpWS~uGvAV?sjM1@q{|D1Jt)R-*0nK+X_xVfw}L;2`>|y3030%Z;NBXS9zz zdFjh{m;4t~LrMt0FB$OLS+|=P{{NbL`-i8(j!KsEg&_H!WMQF$C7WWiK*NW8yM0@@ zPqV?&Qdh6`rD@P~I%FN_bf?B$N$k8>UFK29Q;EI#A&q`Fgj?8FnO}17D%b$HlI{`; z!>5Ky_-zVtYF|@w&>r|mbj^_Q3!es}d>qfxaw81+RINPjDWukr5N&B;!5dq9sX5P{ zb7AEuRV(|KNYB5N6i<3OOq~>$oNC%EMRO?xZ>m&SsWtsehMjDx%cS<&$n9O*f6~>F zPkEM6)s`=jFWrsS+-lZXT3Xs_oDh7UamjN}YcNU2np5=V_W8bP;&jWG$Vv_*Yk;>8K9sZbrTaV; zcrhDr&_+@H_fpsy>#pG5L@T1Ron3Ba74m+2Wbi|Fcd$yt_O1RrNd2H&YOZF@Ios)w zfDacm$P$tkVmrAB{rs2*KKHSJ7WTb4eq*~JpK4`oEmJ)pFzI=|%lv*7H@uc!_Nm`Q zwPN^ts?PneLaot$=kis3D*kYFyem}QQ-J9_{zI6B-*X42a2sYR`l^k@!rYkzG)9`- z?-hBE{;~c0ZJ7!696JiS%T`YHHbeQarVE<-=6vn45v|IqAg&mFi7~sR*)?TpfqvZ< zA2&#nu(sYaCOFWopuu-_xFnEhcOA((hb)N1y2(QJl3W(g@AzIm+cN~L)Igqw+@3Tw zAAMjUp(CHe8?FcyyfwF&=)EnIyZ!Cbm&x~ci;}A4eO-0Ke|rA1R(0TOC+{2Y_`;iS0a*A1f)HR%12PC)pNyPf-0*y_UDBxLdli%Sd3&ts$K>OllHx-? zgeDSW_hNhe*xNKZz6e!pRZl9wl@%BOd zMz?W$@u-VkX7zC*_Npqzp!sj)zV}2dHjZ|+Hx9KLDdbs87p{|9PNN5*IuuHQ1|7;aBw3__etlic*z|51&s28phRsoVs7#NHWc?8ihpc(!caDCWo&+Q^WPL)J1yzDSuZDz>tP##)W~n} zHR1+j`u44cv)r%WEoaLKm++;31qnikr8wU2Sh!Z_l&oINWm}?$pekXYQZWR8$$*B= zpn_ejCY-=Vu2cK!BAoNM2d~N;ubAlHZxS8nyEn5r{ntN5$!c{;;zshquaIZB0Kzy~ z<5En-`wxQl2Q!H2ux4vHH9$Th8bWDxgJQJ2V$yNxuB)Trmd~8#de1wY#AuTYslZ>0 zC7sScjeT?S7R7_N5rhXiXRe{qn{lFPsEx8}C99;Gn6z?cHOQ zVf!32y}f+SxiFzsX;xZ>-iw1Otnz2wR}T9|OC6r$#0$d}BS?V2FJf!vg@tK?65!%; zfLGd)5w2FQ;QKl>y5EY*fp*NeD5F&5V{oEEU!;1xQaAcO%Dyy|{-NJ+ zMsP5LhXfacBLloyOYWF`9@j`v#X3l0E6Sk5BmVkNziUR>K#Du;Q zC=MWH1*>$wdL5nH477;i22MNTU;|-kk*_TL5ixb8I~+!ykqdAQ`ykjBxAXNrAskBk zIc>XdIy2sW51+oIIvBY~YD6xcQmBgM)H~esWvWllSaPQ2q>Ix9BMbL&Q6U!`x{49%x=71UWU@E{9tk&k|R9sirX5-6WjRMwu=B-Q3yX{ZW6ayVJi0(o8JD zTzYRRuyi^D)Kh{S-ri{QL0qt|eBwZ%bljNFjmx~RUljupa}VOMRtiOmAh#VM2q4Sx zQ5l0V{(2NkVGoBrgF07)&SSXWwLW>9Ki>5UxH&_I$#uVzcj=_wWy4Q#qEFl1z5RC9 zT1TnCs<>qSRHZcP>XjM{Cc#H)b$`JflZq{xH8!;k5ex+w1R+Bkq~$pWDMJcd7AXTW z$@*|Q28w)CR|XJ*rMx6D4Q}C%%}3l%(E=M0_AJ72s|rxLIE5nsqCu)GO9$Y^JZDPb zq^;1Pw(#Xpnn`36*WeFNp#`0-k#~X7)!!d*Ch>-2M3I>yuE;|`ik3P}2hr~r;YqEk zPJcU_6C2D>y<9Y=ctAv#gd03r9BBo{_j|b2z9(!W(L{#K{`)MJ%XvdsSz-_wAX0)2 zUSok_IEkAc#KFU6L9U4t9LA_^MN$4Nd++^Jsf}mm$G5&sA<1VO*%PbH+$YAcK==aN%8gJqmETZfA$boN4sVhX8JnIsB;fiRAQ zIblJPxU^cZuQFMXuw<|kOsWZx5_Ln#w9t}Ck9$Znl17;-b3AI9k?o?2#01?=xkxeD zegub!EGQ0m%3`WfCHah)k5$W0VzDV(bkT>I8TFF7+IGj)_HBA1|8=G9iee5SppPXv z`7RI?DRQA!!z(RJosJd|C~?t$Xk^aruoM8MOEv!1G*aU+nrs$Z_ulxMRQ>BL9r;^w z7Bij`>`6@>iIy! zQx#McKa*oQd+ci7$jh#2v-3*|=OWmjNANh0mIF-XZdESYEOl)H`4u*Ex8n<{{!JDu zlN2Wt%bMdx|(^rol!^!vKqI*Ox>|X01PlriGOzCC!2te{sRQ zwtBGkudzG1J{Yxa!S0TPZjPbiTZ%X&)IIS4)IZ$Dx&^#5E%lLD@X2s%t#DEBHCTkf zl4djcg7gZ^dL02?2k=>K1G}GBegjGS%?@>4mws?p|CsVW1{r(r9)zL&KBsP;LR3s4 zgh3XRhZ_`?>x;#PSD0La3mqgRJa;yek&&N1AW8~Q3S^F&RfD zRgQhejf%#|e+_u;YmpAo`@2O~0dT?@Ok+E&jl6C6qvIVvztXIV=_jqoBYFZ+%>E0M z8hc&Rg8;V?z_J(_w_PRNMnFeKz#_~e`(rDs7{@O0eu-v|f6zF{3Cm0-30SK^0ZFAp zp6*WVWI)u5$Ej(?DtppPZD}myk>=YraPpp1R<-8&+Mexkj~=4G-eo-vlCL zz-tO6gjM*O_QeH!-xKz&IJ+ES`QZk??b0~oBEJucz+uK6aq^COMR6{x>m{;juZ}-G zoa_qTM}bin>4WWIb?naVY+ICU^Y!lfo|Z7hPyr-;UNWE{jng<~R-7|d&SpC%)l~Ch zz5bIo^-SmA9{q4jbd8)Ig?qoM1%?qstxm__Cl}=c$R*09Z2-dXSuV?eE6s~*@wFzz zoU+_+Vt;ViqZ=#;OGYlCPVKFbiP0i>k&^KI`wlfj|H8(QfFT4^bJ>A}4aYDtQ`5F# zo-goBQWCJqJ5-W9VlYUbphS?7J2-=?xC55x1NV(EzEYptvHBgpTkCmZ**Qkx7di)B zBipg@1vsyXMBrFaZHaWWM$w|EScYE{ojO+5CMhdMsT4Inl}8aJ9!7b6^E|aG`g{7T zip7%y)+nD|Du9aCnhX^%Acq}L1yG-1p zz1}M)Zai&s*2)T7+^>_NID#2)0EZ{x8^p)RLT2W14~8|hGqP!vSUYmOKcT5)I&M0A z!~)Wb{g|s;;ySpF-2 zlnzvaX*#&Y@$94f;#iNWaWvhp%lqFFx5GY4`6tiv`vFp4XegD>MpH1B74R90B=W;h zWv2;Dt==(IVC}?qt`gOPk|Z&=$Dl|l11#$hihHo!^W%io2J?l#5LqDt{YS+y5_M!# zSXNpl?9H+b8-g9Sf{XJFqX^G}e~a7+a&Rri`@1>v8A$3|#)rJwH-d{%jb|T-JBC4L$t9 zJ2}G*NQN85J0hTfUMfD4(UQa^?GVWa?!xqGbb!J%3NOzJVrBb_Nq6iK+?=Ctj;P20 zjSG~21VnZ>v>a%MQ&Z|v)wk=HSI$vwg?4quN|!$|4(T1{iU_Cjpyd2&BIYtotx`zB zR#!WvD>x)DI3%gRID^QF3mTv&#Y5M7p_g8e|6ah+u8XoyIX~JY*G_OwY#R3`jGNilO8nhrl1Lfn@{fN*tR0B7Bg-@t^d+MNM()M?(S*Hb2yxB)YJiI}ph z{m(e&q>5ZxJKFvO+iS>H*?|~++gXEcXl4wQDTB^t zIMZ*=D@F9;i1qwZg<|Ak@zOh4Mopa~;PZKlsa*$+%(@Q8j7arq=Ea zfPSaJzzJs7noNIp1Lt14-+TKV|EGn#&()@KrH;wr0%aDRg=F}MQ;_N}Q}iNH__&SR z09WXz&gfBT8fQrUxsjqkHfZ5r9asycb!RVZXdU6SmED7$ zUw|wx*)iUm%+(x8ZPeN+cuY9OTj}JkW#};Qm$EO|I5Dd?Pr=SAv-bh{d>e0aoM!8I zt+i)u`UBWc9g{!;GDp*NhX=qbgb$F$9r?iZu17Wyb;OP?$MlXeWC%D@J9S?*hh4Ve zu3j3%XG0G?r*R>sr+*tTUh78ykHZb^8Jmb#ump2ZN)?K*S=KcjOav*l^{bi@ ztEc3en4F_c{U~X>-JB)0j9>|zoX>il>o&IEXOrE0+h~hCbyKO?02^{>a!+r)DfLa! zvjX*MXmF|s=`Kk0WH8IqO|tE*Yk&Soqc;!MItNp^7Z7j;o- zMw|i4>RQT0f+V!FxR~y6tiK$Im4mso0zi_aHB{{%T(D{;?F`pm`1&^KMpdN~o_mF; z$Ho)xUbvZNTq+O&Yk~zK?gDF8CD{Ind%?ZfIq6y#hAYGdR6aq{%=S zwihr0OLIu_qe*&H@_^-bf~pA6%E2S=aHBrW2F*wY`rE56JKZl3!cr5#2=1jU)J!Ct zOQ>9L7s#$Akvrk@Nk4=vWY%0`G{fxIsSbB!Gz3iD+{1^S_d9$=WXlrei z_eAh!F|;~mL=A#40>I{Zjm9SLI7HDH$d~##KS!UL(8A)T?ob(RzsccH1SvZ`j1^|J zzY#POcy5`jEpZNIWTD6U#w`|hi`eZ)B1+&(Hpfh=@I<04Sl)Y5uj_Rx`UKKmFAu1~ z*?&*ghokg3(esTnpGyYiu@y@Crp z@m$+D5`qa+syc#fCozLgJEyiy?1%mNupOEa^PZXXj_P>M?b z-*8qw)=Dild{JDj0v-H>*J8pS2@T$vx@0@JWSn0oqhhj6xq15iIW3^f;(vtXT#%KR z=6#E!@2`Wu^{9}aG=yQ%$gMF(%btXGh@=q?QbY``^t;R5 zttV2ZR($BikZhJx`6&~tvNKEh3uXWd3TYk*C$(mc*kF!<3O}T>J4W7=*+gpLj70S( zHcQC_%dt5VHFax8pY}MV}Gm%}$}aN)=@^<{SWH7_aygWx1>m7~YjaK#B*G-?Ph;No zE)-EX4CaNres=?HxKZj#k0(>$KK~y;9g&yFix)j-WsF{(#s>9-pv|} z1QCX~!%bm@r{sEa6 zK~$DGiquDPZ41#AIRSsOsJl6YnqIkA(o`UgnS?B}kUWaA8}C2*!jLkNj(xMhCZXF6 zvERZ3>)me~DZew61~sI5i@HAd#33)}CmI zBp|yQcId(*s#;AjrC2#oB?it7;f$@q-aC6pVKbbb-LxXMjat;LbZf$c0?TEd^zDvJ z8leMg0QL_Ck2o^Dh+dvDGab$7c3KBwS_aR+&Y92K+vZav_PeC#rG?AG^}N6>zW1Ba zXO!UdcGEPQF7LS4(saSNnzT`^uOLQ`@f+fXmHq2AV*xk=!}*G~Kb@adgT!{qfQi`5 zVwaE3tZOW>UdQ(--cPW7wezDbaRVNk|8rcljYL|w5+u2r-|8%oSY>A6Vn=?S+rvGW z{QDi@!hJ9IV)1B^blXj-Qup_j!c`wz6PMAyW#c6YJ!65K%jq2ySG~9?Njm>eHm`8& z!)k=(lUgHC=r7aMbt7spEOeDuDrlEQ84j=h6=?d`+UJ3#WYZD$6d#{}FG&#@=HFn* zNN}Gb)szGFpZGkZT?)RGL*^*LZxd+3B&9Z8MY0TG013Co5fAy4X>Qi#miXVA79CEZxln|RnBecXI26x{=K)6`YeW@V@(h8|^hR$F97U=eADvws6NtR@3*bH_4bAo;Cj1F(gvV z>4la<)-<@i?!uwKen1=mAQ)9NUHVJn^4jwX>aH^IevdF3%=!J?d8r*z;-ZZqdByOUw(5(IV`H@Ul znZ-X8e%RG_Oc%Q=IusweF-Z8Vc5%YAi@RkU*^??dwmXRzt|7cPj=03M%dW9#$eKlk z4<~y{g$Re#DAyc6&oz_hu+O!V&LMAmCq?v8vG!gf0jB!K=>4G%cLyM(>4*x$gEeo6 zo!RuvXz@WvTrY)tgCLCV&E9>J_=KNb5TWP0k^w{q^BjL<0~a656`Duc7~h^RYu;*6 z0s@CVv~YCzrfN62B#%6qVN?P*m{)_HA*i4^yb!WEKk1w3?WYW?1~o-MA=)1!!?o?` zs%W)$B6g&wNTaSp4XFpr#l4wOgkmes!lxq)LBeFk16qM}jvZ{0Ivjt=E1S-NmyZ;U zc+>_+zH7r}Ki5ogw34~FRP<#;x?F=B1)g079@u~?;c>L(dN{uY)gz;hfJrdNw8NB- z5AU8Tt@H*$e@=XrROXc1D=&&x3^BE2M{c5qn~+8LCdW>&&<({4G4eTn9A8Z-r=)C~ z2f#y(@eL=(IApMlC`Zs!GZV!cTU8DBsRl7HO!b{zwEUTg5{^exQEfsArGg^JK@)<& zFfS;N#e&-?4SFrn7ms^8@s1@Uvg6m7;GT%bnOVsgIP9Yd!BAdWX zVh!pACfkze5NAnbuyk@L%!b|`q9h`jhLge0%?q@~NKqG&krC4M?V#Ca%^yuEF%p}Q zC{LkGv2fo@04%YqpoQIo62R*r`VmDwLC&vmP@V&xp?w_o%7u+&!~|yVXT-{9+QqGx zLPhXay`F)o(zWVGqL+J0Ij@Z(QPZE?`!8&W^1f;J({EI~3h!T8w(4kKRFJiQoFjBK z*(d67i+k^(8oLoMX;iYflXAWM<{#LJ?Lfc|J}UbGLp=?eWKcwY3Hy$IOmIBJIO)UI zvbH^r7?HJfCyQyw6N<0U!xaQk#sR?F)~3`n{4LR(ghLn?9lGNBbCNn)=1Q?T+iZ9D z6Oa1?!5C6nDL54>2#WGAeb4&;cmV`Yq<^U@O8tZ{|C?MbI{r#)jZyuwRt-V(%>gim z`_-){^=g!jrQbL9ejT+xp3>3{_x@|GE_so@tph3prHREg6jtn7-!Fk4I0>9k*=dFV zv?#Ywj3q-kAvQ#N&6y1X5LwuaI~6;)2B7u?E7^B4fPn+`XYo*w)CHotyaol?8C?*L2Y`A9ZSf*UJ zwQ`kd{ri+K;U^8a>D&RMFeW8H%^ddzvFDP|u+od(D0z`q|6BN=e`?~_PGNpskrtMX zWG-%nnN}1#u|^Oj#%&M^~o{Du+2 zc-bajn3EvfQs8)nwmi7}f~w$G&{!L7H@ckKlxW)t94FDITP4vqxznXkkkZ7lf)9+> z1AV&!zXbnLVs^Kzr%U4X_4uzcoch|pL`bqs=C%&m1!+m!uHY5?1lQ&h14^}f-zvyM z&{_C*f&iL|=&6nEEb?)umwhT2k#wXQG5=Bc8-@3O+tAZ!iX2rcP#qN;?SGta;Y#VTU4w)dZvBU6L0RjT+Yl!sAa|Y$~K+ zS)ZSQf+5`%zTzly#bTz2<0Qn2?^#R@7*j-J1y-Tb;eW$2Lo>#jXJo~o#FK~;11i?} zKNfbjRS-~?#8Cj0zO=3g6Qqe-+iuAqokPg_XIPT*z!{@YXy)b-3TX!1JHvHT&BWt*f2#?n5HO_CVWw6%M!57{55XMLA- zqH_2`&4*+++hRL7$fR{262-u8~hxRMN5wF*@r34wS0Wm)sR&DI_kG^2*B|y%7Y5&ggmzu&L{yB z&V+pdBYp?sRUu1Uv>;fIn)`gg4W(aqW-DwYwB{+;98WuzHuA0W4Cc-;{@%HO1>_C{*`=>N5t8D8t*m3kMmdaDcTa-jFOHz+1C;( z{=XFF6ClE_R9(fmben*K^8w`on}|o4G157Op8=9Gn!T8&JM#_rRvL-SS$p7FK?@m8 zfHevOTXYiL^atsB=0@zC1A_*WTzNN^;k|dF{AWb?Yxyd{G6JT7{gN z!+oo&VsIn`PxadO8FNw>*kryaRiBP@)g7vbAen$sy4ki4n^k#q&%e+H&4IUZF)!|z zWJx6QhD+6zs7?510yVkvULjTM409cVT;nJEG6PchV^QK}@RZQ+lRC!fEHpB0Y&HeG zKVhn0P*-26#n6X=!F{_Rb3SrW+`>YbuI}JGe@}g4)`XUA04a3&e2_y3{tt6#{qmU^ zI(unDSAy?YI5Z=T1^0=MS6$r?5co#Jb^?jl!+Hw1cZ3L4KPk|X@WjVz+P(dajiC1( zOWKVL-3Tly&|OB%BS!a8uc54SM^LMHNAJ*n82Rrbh}0$9C}V;)S&)PiViCViN}>hR zNjr0wtVvm1*ohQf6{_KNnux>N8M=Ph$VLz`T5s25I&;HpinI`EdKkU~q^>YnpRI~; zB`IsRJ0;h9Rw0L6ESxtd?CpcOBwMfUx{EuneG|IG{@$R{SECt|4|&x!CwrMcUC zpN_nzx$m1RFKYr+dR_$QLg}5!wdHEu(KO~$M8d{jpp=3G4Y1J=q!4NG4RlFT%AjnZ z_n-L3t_}Liz82q4blvMV5ebO<`V!7Aj^q!DD(0Lf=5z&|qr~S+NRQr~H_ssBEqkR_ zNQJx&n8oV}2xS}=@sdYGL)y{}o=3$862zxGaTz}%41-|t_vYeEXs*Y^&K^7__Ar!H zEBvb0&}ju>ytuh)sWtEd5%q#2paRH-TgE4G7 zwo&7bb9|+l;5gECvQ2dQR&`pQRrE3_xkYSUbc2;VoGNtqXl-rLCJM5~k&q!wwf%2> zdky_Yf8*UW`@tOMU=~wuoY)6qvkW=f`nq~$C~JI#r9x<%T*U&tS-U4Lvkr?nzC;TZ79{juYg z?B{N?^WvTLhrUU6*(uTlDOb_FrDKr7PmJ++(h5_bvIlb3e&rB)Lao~S{<6m&MCn`s zZuC!~?86;%#402b4ntL9RwHaT#jHYio}t)LZp;*hk1}U#d2`T|5s(Ho+G_WDR%ted z9oDNXbK-R`D0Nev0hE%hQH))- zxK)mGHxVkbfmh@zXL}31kur{LyGi&vcJl}fIr4sho^xnRX__HV;u&*6`{O!wx!5)WyS5zy zIao>5UEG}t;OtZu`$KqO^sQPEFG&_J1ku+Q#Ee zkQpfD?`PP^y~{P)??JDy2x;hgrD>3OoQYuxGkSvKY5{o)pmS; z!Wcd77_2lL2y8|eF%C*ImW?Ysw=AZ%pQlWJ{4^$8%N4qu)NHr*zdtbfTts^BtNSJ< z4|fgi^rL*2BTn}2&#Kb$Qy;LLR%-2>>|NGga-qHtfSM}L4)57k8 z$s1b)Om+s{N#vP#~@r8X45v|-aB&7S9AB=eHgT7mTAITw`MBC8MR!-800Hg1bM zTT223!;P*XuETB)82bb&IpFaU?Jz0WC$juaow_OUfgKIC0>kK6Op{i(4t!6}M6bj9 zvRGLy5kTOj3dM?g)Eas{3&m=Q=Hd%k?+}sq${0cS+2Cm4wZniIgk;W{KO53Jg9ayJ zbxk$28b-!|^NKng`)%;-jm&~)E5?gBue&k)Dgg}demDIQCn!!24f#3fDR{eMGQ&`V zx?zXL*AXVLY-Gu6Fh)!fPa0=n-3V4<7Cuumkb;5_0W>Hg)&RJ=1Fr){8sqSF-kigJ ztc%N1rjhlh>XQZQWGW&f?VCz((2cURDAqcC(x>ChzzfF^v_}4#HSXZuV(Wf=jjD%Z zlX0S-8hlH&OPLr6`)Aacwl6PlQ#-@lmG25jhMa%JKKj<`4^&U%^#(i;m)vjhdhBez z!QP-bJK@EfRPwte6xHWOA$2sL{Uv6xkSiPj4Urd^h9ILDj4{~0*WX?ZDzHvC8848$ zzoOK&I>+^YCo_@95d`Isgvo5l9pwc#hoWxxlkm$dXpmTcf)jgl=gqZAwIE5w*$t;x z6+Ufjy*@AN+nOfO6?|gQ&4`WoHpIZex6pmuzHdI=Jzhj_EMKQ`jhsJN72a>`@?vA- zpW%6XF^GM39PU7}yjxq-Z(I_-XYUj1KEtQVW}lXv_{YobhVReJml+i|TeOdR58BHo zH>{^tnTt$6IdFCzrpToGKOB)T)ogosf#_Gyx~x29RK#A-1iR%K6(7okcCx{yNPBrUy&U1!*$KKzYeDr7KHRbd&;6$&-GrZRt#hYRpw&Be?7QAQj6aIj7 zMQF90UK|(}kl<<-82oBL_P0oB;O)!ftoL6L0`~`S<{@MK-Bw_bX3b0R@3;we1D_sQ z6~`m9Pb%Kr*H0im{QT+cH%D}URniB^Nq?>}>tc!5@|QHQ;hk43>c_NS;`l{rtDG;+ z^!G;lBz$LY?BgR=sg+PifiSA*C4Q=EiS0)vtZ`?vP2u!^LOGVP*%Qj=VIW@y@&~(O4#Z8JoDI{;vV+lUkmcBx-{1s}R zWmUNJf=J9O*Hy2=F=xdd$KM}4EGm_{)ZaY&`B~<5t1mO(-gSA)H{G7|UhU(xnVOzc zCBc>;Ug*P40x*mR_Vz-ra8cF=D}GH1*!|f{m4DVJmd>S1LPZgeBv}iIaE>QcID2NL z;HGdnzTWIK{Zc)hAh5wUPY$N0piCMgE^Rw?&Gl-Ze(mZ$e0=@r8h^%5+rT*#@$?OD zz4StOH~S5`v}1Y0?jElG{VkA60)ihh;#WBb90 z)%F!%VE^!}lr-;p9=+Z7I(*2DGYss@H|`gu(5b0?cs}*SXnlwr^=MaL2wFg~d_hqx z0{*YO=;O^kDs_ivU}9+++F486*CBtR{$#M&1RdS=nJ zdHt}mlh?e@$?8wF-qw-`SS`N?XwgowEaQob?4jn6yFbvTC>LhsDy8XFbx+a1 z=WW4!c2RWd;jVNi<*`pU2^ zrX~XwTMVH|zZ6B(?y4)g{u~@$MQy=2Bw-Ln^9i)#RhOE}#3=+vFczMX6&m7B_xU|+ zZJO>XbcLNG>t(NoZO{(32C!a(Q_KZ+`5cO>drEPec<=>HR$@`}ZeAcT?~4={Uj7 zH`iCQiqH+nRnUGNe0MlT-G{5S?-wfrGq}p1Q&1CY*I$b0es90(11hBlS6nTujR%h5 zDsSMBnV5Y|pgX$)FHBpkz8tZG7-B!V{lcHN=(nrCx+bB@FV3#>Z-3w(yigX7Gb#4# zhbuW>mF=RdR_PLuK7cE+fC^ij-UKnq*n9ql+9}3nsY-)kdOGd`es6QErY3>&D!eV; zWjx4zKkp^{LI(%Ujw92~%h>2C)So-}`kV%Bbr~KU*U$EyeK6Hk6C31ni`PC-Ru+-Y z^a(p}P41SQFtNeV>Z*esfHA-gTGtEwoy1n7RT87|Cn5E!hF<=6yWOl_tPF$STE(xG z)>o10)sB`)JEkakMErnTr>Db|I43r1?Y5z=$8LNZr<*~SAm;@$v+xIoI9uy&(yK4Q zN1{hoJ^|~f1@rkwKj^D>thggd21sX%BvGN@9qcl_or1E|66?nL+drRz?BFig2D&Bm?0PUr_fw zob^rx$fdU`dl3cEahLM6&&sF>9q?n|Ltpz*%^YFzwAui4n7rSLlU*?xw7&T79GH< zZ>V*bto%hLSoS;<4_4TQv;X^pGD|H$Ni*&=;B1H1H$}z!5|{s@$F~Xl74Qz@nM4ka zp%giO`Q~96h_CS*W~qj+Wk}o}FO@o|0Kxzl3-Z(=5*H>3@2y}US~}aIS@Q1L#?>2UogO;W~Jef7~L}a(C{;-XQuRPOb!$|yHwG%ktnFXwpbbbd6 zJ&&TC0`E7Iv%=CJUON^%!^qnkt_ib;dV}NiYVEi_a3+JLOgUgNPh`jT0)X~QPfwP)_64@xG5*1gFFXH6q(>I4} zq8KKWhGo=vS&DiqvgP2-w0lCLiX!TMz!WS*Rr854{3!5!!m;g;TVMroLoJs2s!RIE z+7kC1;ZS3GvgLVS&|!!hbs%roe&wk;!mBsCDAMi{ecJN+@wz}<`!PspN_>TS|A}@p z9T&wuxk?;*hEhRA$|Y==0d5r9TC@-+4eqL9Q!B{ek)Pa{JT|&Cet(|M%h4JxD}~E0W1w!I6gM>l_C1v1*$BHB&3quEs zMbQ^w?IIeLj*5nB{1Ix&IzUi z!WDQdAVN>h46Ue)Vs@n}Xy`?t2zNx=2GT0ilvQ$3rOMRC(PE%#sQRb`lQ>)*V?&TL z`}e&-c5eI(99F3Hu?ja#+v2o5DjE*;`b)47W040<@j)Puedal>buB_n2>3P36gLsF z@IX&eSvT(eY~F@9f+9dbBJHt;^GI4bRx z#hI<+R@LiDSFL=yRSeOeKvjM!LZf<8|5UUg$ecgbUn^`8wo`g4Qm`65!g!6^IAsc2 zU~C1o1AC*b2wFLZvA88e>)^&VjiCURFF*{{O?(b^L5!SZ1c(u`E&*m2A0 z)y0dirq6dIHoQ7bFf2u=lepb5$&gr%-&X-1jMM{ucZ4{b&6*N>%nBbi)BXwV2#oGE z(fx5rPJw~f5a@s`;C<=F)_f^6W)*3y=M_Fps-ZUO9wAZR~jE7)H$y)861>%W^sEPl>69^hBQxk5E$mXFuj7JR8MNvM{Ts{c{C zQI6ht%Fe^mI8yq2+da5urkjUelob0$(pWXT+KMsT=?(KLD|+J{;|jZ~&GS=+;Xd7= zF(Rht+m*_QIn3#_{-07X3*c}g*goKHRSSc&{plVD6(J!t^|}K>TgufW`)UudL@O_M zbHL7X;I%Y=<|#U^YTB2`=benFdi#`z47YcIeuFEYhZhq*Tn2t%W~)RbBFA74exikf z6%89NL*SZu-tW||-d6Jc`7kh=XF;dIy!^x3!bS#N)bqL{bRr^iAe8~(> zRBSo*JNh$2LEfbN+@Yqk0NoIEgU$)=O87s5u;_Y?G*J$b?f;Npb2Y}Qt%p$7%tK)! z{@wV75$Hbu(_&;vn3?9Lz$wwgO3`=pX1H#D|@@p-Iid8p%RR^{~CgJ}575!0`uu z?Hc!HpU7QkA7VDeUIF29fYH@w4|T$gZ)9ibhpo;hZ91W>@^4Cmst^Qx4YP8&+Pj+S zF}0*A7AMDy^I{j|DTb}F0BiPvTa28Apm@Pi5UDGzbW~MD*DpZq$duB~^G{r)A)aG` zVG%+UJ8L3-jQC*o0k^#f>2K$dFMN6H@E5v-m#Y5T+xIW^W)ZVB3QEQUI&!DTGNyc5j%#tz#A%WX`@xt)==c8Pn~20vZV7vLuFy9OTgQcZ;HP20}+4%@!ybxNJpG7Xo|*-ND1O@BTHi)lC+E{$F7)K1;y>iAT&F znl*L^fP;iyi%eg@_jl1R6Ery?ZDzmoeXM`(i%h-iLBw{S4?O;FsZamaGwjtb|MD;Y z%3p5zCvNM~{*(K{zxWNDslpYiv9Q9gbg9v0PLZW#$%s51lBNT);gBL3;Qz^!1hz!o zJByGOInJ@AgQE>}7&6{ifz1Rp5*S;c>NT8cFuZPYhX=qMS{t(d24-b|>+Pdh-a=SG z_QXw`9uXZ}VEptogx0j)dyLKp?#GV$c+C*6*~G04$X~gR8WzO&?Pu|S`B#Xhz#mDZ z)^KDNZ+k#wGK8GP(-pc?q8L&z!p8|ggrhv_(fjecY5bj^$8XKxgk&`8)9v-Se)Bx% zZoY!8O{1bZi#MNQZuT%+y)E+Xr)WhUfoITqOfeBgN(4cCfN0@6NJ>Llruaf3oWW_! zmT>GJSFC=kVRYi%TpIl_PyOM4WP9a0Zy~NagcOsiLyktba-i1I>+rL0@ zZ4(`4Ax-GKz7Yzy>i+2z2F&j}Q`1`uKi?F(t<8>MnH#XL6J$xpjVt zJ#$T@2nlP=%2(c6oRO5q$C@deG^j8|h^kw4WH{qdjBa6d3T6j`AX&bM9*w|jqjdw5 z^w74zN`Vt6cy-{I-F7VOr0C`G8*P9BA`v3mK03XMsP(Y5jJ!F;@JByHt~5KvQQG#i zICGvLKE?KpPhfNv_h`+KGQV7@J|^RT>8erCRY`4l6T)!lEmDj^{F(d6w>A(jUO2Koo9wNWEiOC(*BBH%5^x77Bv!qz>Qom;(UMI%f>f+D0Pz!a;${5lS!I2J)1pEQmIgi+%r@69?VhT^}A#i;JV2JQUOyDxu6H)w6e~W%|4&jINMt#z9 zK!3Q2HU+)zO=jlqWV?F>VKh;FhGF+6d9sWzH0`*=xstL>aHYc-4^K4kf*B-|A|GMO zF<~HSs+i1V6ne;eH?NXzC*bYj9dPI9= z%&WyRPE=MjpZc4Y;YBcG=$wY~68MMTPW?kaiSs1MGhd*%`6;sQF_u;vEWH06n4KQ! zXI`Y=3W(lv43n2+-?)T-cox^Gkw1Hr`k8$sXV;KcQ0^oc4Eg>c@A|!e4yM4L*#k}^ z{1}VF>};V$72);jjW3Xy46O%9zmE1j5RRbMM#z9TYLlCaZlcSCz;9rkCJ5@JX|KXh zMNBeU!D+{6XGD0d%b|t6Ox5QJJr9xYpv)FF?_$yoq9~`+9)r1t$sE@0!l_*-F+k)u z5P4M~tN?>RqHv|bV(X(ieI7k3B@PiLVX1n%a>QxfDWT8y0sM%v2M7 z;z8CwdN0$#K?0?4*(S%rU&lI4F|6KfC(oXlbXCSoV9SX-LWPaVVU||pX;*1znfZN0 z+T`ZPegl8`DL^1u;N)-q3O9fKH(AS?j7o)48k@XI&TgiD@B@s#`WpG>Ed&9Y4QjK8 zkU`8x7N0;#^=<61{?ZgL_f7rO>w+8cI^j`>38?On6DfeT7N<4V6zD>ub%8DN%0N$7 zfQ!T-o;-`cxQ^5%QaV)XkiNnkm?zopq1SH^$93W}hbeAsFg69ljRdovA*`ZEBz7Yw zYhEE3z6)GH{Fb|z`@jQ~#zU`dki57_bZQO}1_TX-^nJ|8q9OxZNbLIC3eQE z++2Q!akfd3^{LgT7!6ig*mpM@Yp;=Py^OQtN)+r$6b|7=l{2cTDF0Ffl%ow~FpDk+ zNUKq9Of&Eaf(~A`#%z*sbN*vI_q)H(@^FL^0cGhikP*X?rYv%l=i@beGVO>u4Sef} zyfKLwk`~p*^~XL8b{?AdgSQL3(={af8GYurVdfa#+#Y1@0HS<>X6Ui`_zLx-y9xHs z;y=C2FzZvl^Dw0-F>z5!(l<44vb$XjO z*#DvT)7ZD?+gY&0|2v|n`{n}XtV4tm-{`o6(GzT;GOQBT;&AwnKTD8| zh_oPF$xu5xFtWI;Ad)`gZbtKg!_*)BPIQv7@$@zFe#-Rw4kM;(q>DZDl0{`P-l6-+ zuPo7i=iT(4dI{4@$j&cOe|R6otuCEMPU9We%kV$E!1Q~MAw5ZSco&R!=-j)H&P<>F z%But=*bo9U@s#pFj%B57tW8rCU1~q@5cVJaEW^L?L9TtzDMk<8O%nNRZeAqOBepg# zW2GZax9BwISlE3RQCKG{9V^@CS-ScMgr-1SgV7T$o5?9{iRW^h(Fo&kWriOtAd3O5 z&OM}~Rh%dB8RLf$nNC?KN}jlQKUbc8iXANpVxPhU^o?Sa8f<2eo}%8aL8Fe>3Q>VV zYfT_68%d9%fVZA>Jbb3Qyj~50<|!Pj=;#*V>3Oo}pQGHoj<@d&{;qp5`EyL|5o~{U zllGna2@W)|XV)3~Il+Ownxf3m zdB(82#xt+|3C?Df5Ww>=(pBA;wRm2HAGN53(|Dd=kyCL<ua z`d*~h#>oao%;KEFm;+evG_rOG_skmIKl}_CFe-B<(I;rpqTYxIi!o|#1#5F$1bWv3 z$^ECew&1wB^i?9&=H0EwF_mF!)lE(6PFYl{2PrF&yVe<{11UzBqKmlQN4%lI6|bk# zm7Byzo@V&+{g`e=TNyH9?a5V|I>*^1-2PMC@oRsB>WGGsQ!pB3Q zYmS58^~hf_59^yIK=b5`xsnb!9Oui`r0Z^B-9=`#`x9- zozwepD?2dTB$_H{?LNT+2Y-qF)k|Fevri%e@JlFtP*~)yh{jKUAJOp{qOE^Ixcw!} z2F%Jf)^xFQin!d1pB+Z;d6eb;Ho0+(cNSUMyhL8+IFpbJzQLZx1C;p?Q|O9*K!Nfd z!e;nl9#1cW?tus}Mi9*2M@Ao2Z=s8%I^OF(;p*Ld^^cyQA74dyf_hyr%smE1q7#D| zm&jP+wIT{%f-MostD?Qi5+M@~pHRH`lI6epK}X)7_-?5hYWI)h1sKllI$whWwR3Vb8-C*!er0d-#ghu*1z6w57>7_*8ix@MF$ohXbzbQ% zfh6k_dJ&!3{k-rm{($u>S4i~+c`+bVAc7W|?jeN-XmnYkg~wN)U*;>%Kgs<^@8-P^ zy^Y)xI9)^7Aw~p9e}pY_N_P-vK$HzU1;(pVqHz+{+E257f^vDC?N5CPs6728V8dyQ z=OM;h^!)vVfrm1R?A`v|x&|63hFC5Tb<&P9gjmjM;(wI!0dsyNxlh@DHA5@nap#XjD1CW*3?2ydB%y zCg@C4j#E6($B7mu)A%aHm;n)jkzFC4Ss+>8`gVfu;y*!WxJ_vglMnpQi<+5S3j2DA zd!txY5m(sP$HEHJdi`s-3KdokgfmDXv9DbteDM}ucZegz&BVBqd$H@=6iYqIWP}|X ziW>u*S7SKNN%IVEO*2~BpnGczw=m7@-FK61_X(UJdgy-K&WLibgBOG(FW#hf*AWKK zU1Z_AA4X;c-b@p()4-g&#MDD~GV}JMi24*ViU>MWOx^ny!ukCqTNe-q+C+cQmvVsCkoR`~*Pun&LgI8i*q;_9b3ICUCf zGs>dCXbrAJ`faRM80U~uQEJMf5^Hwqn!P6m?A>j7$B_zK(F5>nC1(6I z!NN!I_C1W>c_&5-EH9#VmlQW%#BCWG_dJRhPviWj8Qf6FgL^1mTcdb!ko|7%>onbn z!4O8NLK{b+A?1=lAJ7y~gIs3mDoQ`}jxL`pP*ZF+toQ)dNKAQ9pBxqaXgzUvdjVY1Gyjk>q$L!=@LpsTv-9=mDAu~@)e+8z>4(oikrGZfFc@??#_Nq>y-V%=4fRj6S)?6OrhSY_vChLeh40mI7Ocq$JrB$lN_vQJgprCMILNrS$bsqmdG7OyYu&3P zfkh}s5Y|blv$;H^G$qb=_;HL3B{Gaqk&pBwMQPBw3eFHX_V3Fn zL(n=vdh6eyZ+-%&TKEg!i$C=cp75~siv+c8#%Di=+I1iP-n%ejo8-A0l;>|!G9V`> zXNW@*oH|5y>K6U)9W$6ISh;$UgU8=ZI@+Nab{X|H7`lTMI1bEhT+v69{>dTc%5=>Fj>r4++q*M5Y?O~e&8fKk3UYI;RLjAA(NCwZHXiM zHaWCsgqdJePB`KS{Gf^Fg_yEHO}zeJANwp5uQ(>S+5`))%pe`wx!XAh6TdaDK7;wv zG%b3Jfiy`OuYt0P(ar@d9#MTSy>m#~Nljja;M>K>-&$hv7oXN?vjS8c& zBb*ah*CLK)DRf38Qerv4xlU#7=SJk4%d}_T&$IvTNtTm7Mu2lZ#)j-{X~vrgLI{FZ zh_8IYdQ9AIAp?c-gDMBnl-NR71vN>SKe$L7P7?*1erY(is~SQ44p`fzG~jA2MDilV z@*iWv!o(JH#K=-u})zgDi}Pvi8&k*#&_b? z_A=^S1tBxH&~oYv2VnR2boTKGF}W)bKDwh5?@P@Ec9) z-}Me!Kk^Xr#uf5w>llWWX#UQ-@arMH3olUu+OIM7@B@TbE}#y;{*O*VMZ_c($wHcf zE(_AEsBD8KhopNQSa%Z;UfeEPZsIr_w|<(q^M0h)M5kAzA-aP$fxbv$Z_=_ccGm)ZLcA>4@O!J`nwc%lDSSFqkFN|W;ZW>)*3 z|Gk?G(%&>5z8+&G1Xz39EX-7_Vp|kAUC{0KdFj%pxw`ooR)&wUnLWcs@jN|yiL_Y6 zfBri0^NYw)f^-II3Ld(X^tD?kSu*wLoy7MYBHbA=SleN6YlZP*pEMARURoi)x{4Mh zGpCOd9GOF}4X`!EkstXG_Rs-ZN2kz5#@zQkLjS23nR?((f|+StQNqqPHjwy-_E0|_ z(;Yc3ZKP}t;l+zjGwd%C>UBQ2_iJRu?Hi(-Oo(|JwkNtgAt4u#+sUqaqT^DgDqNm& z=n_J=&2;T9Bx8o!Vaym)mJ^eU1YC z1FZ2#$C7-zsBUoILxd8P!Ve_%&NN0if+)l}fiWe;IIl1;1Jl7R9)8rIi$m8OA!Se*&$vm!7b?Qq0wsN-sKq$l zK}v-b5+@XC+NEBfr@MWFFaPTQfDXFVy51Uu2#_ko51K@cX=;r*YV9^AALBU?wnUHn zG&*xEoV=I$JqIYVobh;wb1Bm6b9r%vJ5KMSvulpH*&&STcwwzN0F;lA9?}btUVuO$ zl|*@d^$G+0pib=r?_%n&y@T@HC5q7uwYMF?6(#A#i{xrT@L+AmzoJ=|kvitzb;#rFHJYMt=Qe^0S6Q`kZ z*Dn&EeuR7~pz-uN+vF4sNmv2k&`19oD;J)_5g|zNnPT?P^PIRRVYj+WbM;BmKmBJU zpZX29Klwk?J%5$jnRnnt(YLz85^v%sOo$q9?x5a;Uw!i!D8AW!Yl6MIiR{LhY9r{J z;IrTO9acx5q~09RXi6G&NfayMP!Wb2RVzu4YKl_@wMzqB5aBjPm_|UR9a(Qk?a*#? z7-5Xz)(h9jl8oth9c55v43mtqlo*@S>C8~v+C;@6wY!e7^!dk0o_~$j9fwJmH`#gm zES)na7{7K4zf-4ict2jNj%>z^>XPfyXL*paxN?ET@0b*gA3k@NnXZSO*({rTy>!1M}R#iu%=I*E@6rB6p15EGK^;_ zREF>Z!nlL8i&My6a@7J zYOOh@_nbsX$hvFjbO)DqQOR{8ncSCk#q8`tIT?i zx;8|fBbekV_{tKiKEcK_B!Bdq>|E{Ae$NNLg%}p@o5sJ}T~!tG=qBar%|QG&I|aJi zSrXPwuyliShSCcD-KT$+_UtZKljy2^Ct{m(80N!`qTmH zor84t9AmJxh)oAbr3iumPZi8Z0;4x5#$Afckd6}$z4d(@x#ums_TnqpqKlBwPc!a2 zeFR?x_;C~IdB`wA2GJxKlF6!Wa`GS{Y)rs#h46f&=i@7%pfknH`|lth8EgjX`Zat& z;&8j5{dVxDVVqTmTo6DINwUFtjB(Yy7R(?;<%4B(6=^3X|AZ{5l9a5e4xak#N6^Uy z^0bfV3#_XsNGQlwze?-mFA(2zigfWR`Sl)pl+t0E9dZi0$k_Fm3*gTC4Q*K+ZeG9} z_D{;I?8!Y&F}fxx2VIKT(r8K=Z&XDhSY~qP-Yn3B0g^8-$0}8F@Ltlo@HVU0EmFl*Pv`VESEDSnb|rLI40D z07*naRIjXRO^O#SP@6f-{NXzo?rdQ40a7|B49WIY=&hnNN8ij7D?wgtG8j6FqTtBe z-$%0+vvlza)+T5qyXJN=zk439)<7wR@}o&Q$m`R}>%o!gHu^0l(~FcTFDq19@bgX;gAuAEY%39@nrz%0AV56I}c&R^t;Y5c=ifY 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 M1~r6KYd(4NAKr*`A^-pY literal 0 HcmV?d00001 diff --git a/demo/r1/demo_reports/png/Dairy_Products.png b/demo/r1/demo_reports/png/Dairy_Products.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9088b17607e0e77ff1d3a24a19e38874322d38 GIT binary patch literal 36952 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 X2Auj*rp<#800000NkvXXu0mjf-1)}y literal 0 HcmV?d00001 diff --git a/demo/r1/demo_reports/png/Grains_Cereals1.png b/demo/r1/demo_reports/png/Grains_Cereals1.png new file mode 100644 index 0000000000000000000000000000000000000000..514e33aaac4672aed89e58b8f7c80a1579f3840d GIT binary patch literal 66362 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%0D&d!I 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 literal 0 HcmV?d00001 diff --git a/demo/r1/demo_reports/png/Produce.png b/demo/r1/demo_reports/png/Produce.png new file mode 100644 index 0000000000000000000000000000000000000000..8955fe9c849a38dd8315d2bee6469f176ee85986 GIT binary patch literal 67390 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

O#h0kT?U*@xgLC? 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 literal 0 HcmV?d00001 diff --git a/demo/r1/images/logo.png b/demo/r1/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a466bbb3b800b9687a42d038b69c42a2c62b40d3 GIT binary patch literal 18975 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 UQ&b}k0X@jz>FVdQ&MBb@07rjpUH||9 literal 0 HcmV?d00001 diff --git a/demo/r1/lr1.ico b/demo/r1/lr1.ico new file mode 100644 index 0000000000000000000000000000000000000000..2eba2a493efa7db74da5ca63be7e77105a0ba21e GIT binary patch literal 323550 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 N^Nw%I9`DHh{{iBnQqlkb literal 0 HcmV?d00001 diff --git a/demo/r1/lr5.ico b/demo/r1/lr5.ico new file mode 100644 index 0000000000000000000000000000000000000000..e1bc436c471eef270a62beeec6e9ab358112fa14 GIT binary patch literal 323550 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 G|Nj9NRmE=r literal 0 HcmV?d00001 diff --git a/demo/r1/lr6.ico b/demo/r1/lr6.ico new file mode 100644 index 0000000000000000000000000000000000000000..6bd0818ca632b55c8e94f0c1e89e16049d5dded3 GIT binary patch literal 323550 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 literal 0 HcmV?d00001 diff --git a/demo/r1/main.cpp b/demo/r1/main.cpp new file mode 100644 index 0000000..06ac390 --- /dev/null +++ b/demo/r1/main.cpp @@ -0,0 +1,42 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "mainwindow.h" +#include + + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.setWindowIcon(QIcon(":/images/main_ico")); + w.show(); + + return a.exec(); +} diff --git a/demo/r1/main.ico b/demo/r1/main.ico new file mode 100644 index 0000000000000000000000000000000000000000..6bd0818ca632b55c8e94f0c1e89e16049d5dded3 GIT binary patch literal 323550 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 literal 0 HcmV?d00001 diff --git a/demo/r1/mainicon.rc b/demo/r1/mainicon.rc new file mode 100644 index 0000000..83c0128 --- /dev/null +++ b/demo/r1/mainicon.rc @@ -0,0 +1 @@ +DI_ICON1 ICON "main.ico" diff --git a/demo/r1/mainwindow.cpp b/demo/r1/mainwindow.cpp new file mode 100644 index 0000000..2926572 --- /dev/null +++ b/demo/r1/mainwindow.cpp @@ -0,0 +1,196 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include "lrreportengine.h" +#include "lrcallbackdatasourceintf.h" +#include +#include + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow), m_progressDialog(0), m_customers(0), m_orders(0) +{ + ui->setupUi(this); + report = new LimeReport::ReportEngine(this); + + connect(report, SIGNAL(renderStarted()), this, SLOT(renderStarted())); + connect(report, SIGNAL(renderPageFinished(int)), + this, SLOT(renderPageFinished(int))); + connect(report, SIGNAL(renderFinished()), this, SLOT(renderFinished())); + + QFile dbFile(QApplication::applicationDirPath()+"/demo_reports/northwind.db"); + if (dbFile.exists()){ + m_db = QSqlDatabase::addDatabase("QSQLITE"); + m_db.setDatabaseName(dbFile.fileName()); + if (m_db.open()){ + QSqlQueryModel* customersModel = new QSqlQueryModel(); + customersModel->setQuery("select * from customers", m_db); + report->dataManager()->addModel("external_customers_data",customersModel,true); + QSqlQueryModel* ordersModel = new QSqlQueryModel(); + ordersModel->setQuery("Select * from orders",m_db); + report->dataManager()->addModel("external_orders_data",ordersModel,true); + m_customers = new QSqlQuery("Select * from customers limit 10",m_db); + m_customers->first(); + m_orders = new QSqlQuery(m_db); + m_orders->prepare("Select * from orders where CustomerID = :id"); + m_orders->bindValue(":id",m_customers->value("CustomerID")); + m_orders->exec(); + }; + } + + LimeReport::ICallbackDatasource * callbackDatasource = report->dataManager()->createCallbackDatasouce("master"); + connect(callbackDatasource, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), + this, SLOT(slotGetCallbackData(LimeReport::CallbackInfo,QVariant&))); + connect(callbackDatasource, SIGNAL(changePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)), + this, SLOT(slotChangePos(const LimeReport::CallbackInfo::ChangePosType&,bool&))); + //report->dataManager()->addCallbackDatasource(callbackDatasource,"master"); + + callbackDatasource = report->dataManager()->createCallbackDatasouce("detail"); + connect(callbackDatasource, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), + this, SLOT(slotGetCallbackChildData(LimeReport::CallbackInfo,QVariant&))); + connect(callbackDatasource, SIGNAL(changePos(const LimeReport::CallbackInfo::ChangePosType&,bool&)), + this, SLOT(slotChangeChildPos(const LimeReport::CallbackInfo::ChangePosType&,bool&))); + //report->dataManager()->addCallbackDatasource(callbackDatasource,"detail"); + + QStringList simpleData; + simpleData << "value1" << "value2" << "value3"; + QStringListModel* stringListModel = new QStringListModel(); + stringListModel->setStringList(simpleData); + + report->dataManager()->addModel("string_list",stringListModel,true); + + +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::on_pushButton_clicked() +{ + report->dataManager()->clearUserVariables(); + if (!ui->leVariableName->text().isEmpty() && !ui->leVariableValue->text().isEmpty()){ + report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text()); + } + report->setShowProgressDialog(false); + report->designReport(); +} + +void MainWindow::on_pushButton_2_clicked() +{ + QString fileName = QFileDialog::getOpenFileName(this,"Select report file",QApplication::applicationDirPath()+"/demo_reports/","*.lrxml"); + if (!fileName.isEmpty()) { + report->loadFromFile(fileName); + report->previewReport(); + } +} + +void MainWindow::renderStarted() +{ + m_currentPage = 0; + m_progressDialog = new QProgressDialog(tr("Start render"),tr("Cancel"),0,0,this); + m_progressDialog->setWindowModality(Qt::WindowModal); + connect(m_progressDialog, SIGNAL(canceled()), report, SLOT(cancelRender())); + m_progressDialog->show(); + QApplication::processEvents(); +} + +void MainWindow::renderPageFinished(int renderedPageCount) +{ + if (m_progressDialog){ + m_progressDialog->setLabelText(QString::number(renderedPageCount)+tr(" page rendered")); + m_progressDialog->setValue(renderedPageCount); + } +} + +void MainWindow::renderFinished() +{ + if (m_progressDialog){ + m_progressDialog->close(); + delete m_progressDialog; + } + m_progressDialog = 0; +} + +void MainWindow::prepareData(QSqlQuery* ds, LimeReport::CallbackInfo info, QVariant &data) +{ + switch (info.dataType) { + case LimeReport::CallbackInfo::IsEmpty: + data = !ds->first(); + break; + case LimeReport::CallbackInfo::HasNext: + data = ds->next(); + if (data.toBool()) ds->previous(); + break; + case LimeReport::CallbackInfo::ColumnHeaderData: + if (info.index < ds->record().count()) + data = ds->record().fieldName(info.index); + break; + case LimeReport::CallbackInfo::ColumnData: + data = ds->value(info.columnName); + break; + } +} + +void MainWindow::slotGetCallbackData(LimeReport::CallbackInfo info, QVariant &data) +{ + if (!m_customers) return; + prepareData(m_customers, info, data); +} + +void MainWindow::slotChangePos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result) +{ + QSqlQuery* ds = m_customers; + if (!ds) return; + if (type == LimeReport::CallbackInfo::First) result = ds->first(); + else result = ds->next(); + m_orders->bindValue(":id",m_customers->value("CustomerID")); + m_orders->exec(); +} + +void MainWindow::slotGetCallbackChildData(LimeReport::CallbackInfo info, QVariant &data) +{ + if (!m_orders) return ; + prepareData(m_orders, info, data); +} + +void MainWindow::slotChangeChildPos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result) +{ + QSqlQuery* ds = m_orders; + if (!ds) return; + if (type == LimeReport::CallbackInfo::First) result = ds->first(); + else result = ds->next(); +} diff --git a/demo/r1/mainwindow.h b/demo/r1/mainwindow.h new file mode 100644 index 0000000..e5bbd32 --- /dev/null +++ b/demo/r1/mainwindow.h @@ -0,0 +1,80 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include "lrreportengine.h" + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); +private slots: + void on_pushButton_clicked(); + void on_pushButton_2_clicked(); + void renderStarted(); + void renderPageFinished(int renderedPageCount); + void renderFinished(); + void slotGetCallbackData(LimeReport::CallbackInfo info, QVariant& data); + void slotChangePos(const LimeReport::CallbackInfo::ChangePosType& type, bool& result); + void slotGetCallbackChildData(LimeReport::CallbackInfo info, QVariant& data); + void slotChangeChildPos(const LimeReport::CallbackInfo::ChangePosType& type, bool& result); +private: + void prepareData(QSqlQuery* ds, LimeReport::CallbackInfo info, QVariant &data); +private: + Ui::MainWindow *ui; + LimeReport::ReportEngine *report; + QProgressDialog* m_progressDialog; + int m_currentPage; + QSqlDatabase m_db; + int m_currentMasterRecord; + QVector m_childData; + + int m_currentCustomerRecord; + int m_currentOrderRecord; + QSqlQuery* m_customers; + QSqlQuery* m_orders; + +}; + + + +#endif // MAINWINDOW_H diff --git a/demo/r1/mainwindow.ui b/demo/r1/mainwindow.ui new file mode 100644 index 0000000..52eebe9 --- /dev/null +++ b/demo/r1/mainwindow.ui @@ -0,0 +1,213 @@ + + + MainWindow + + + + 0 + 0 + 369 + 192 + + + + + 75 + true + + + + DEMO + + + + + + + + + + + + 0 + 0 + + + + + 100 + 100 + + + + + + + :/images/logo + + + true + + + + + + + + + + + Report setting + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + TestName + + + + + + + Variable Value + + + + + + + TestValue + + + + + + + Variable Name + + + + + + + + + + + + Qt::Vertical + + + + 160 + 23 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Run Report Preview + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Run Report Designer + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 160 + 28 + + + + + + + + + + + + + + + + + diff --git a/demo/r1/r1.pro b/demo/r1/r1.pro new file mode 100644 index 0000000..36665f2 --- /dev/null +++ b/demo/r1/r1.pro @@ -0,0 +1,44 @@ +QT += core gui script sql + +EXTRA_DIR += $$PWD/demo_reports/* + +win32:CONFIG(release, debug|release): DEST_DIR = $$OUT_PWD/demo_reports/ +win32:CONFIG(debug, debug|release): DEST_DIR = $$OUT_PWD/demo_reports/ + +unix{ + DEST_DIR = $$OUT_PWD/demo_reports/ + QMAKE_POST_LINK += mkdir -p $$quote($$DEST_DIR) | $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR) $$quote($$DEST_DIR) $$escape_expand(\n\t) +} + +win32 { + EXTRA_DIR ~= s,/,\\,g + DEST_DIR ~= s,/,\\,g + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR) $$quote($$DEST_DIR) $$escape_expand(\\n\\t) +} + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport + +TARGET = r1 +TEMPLATE = app + +SOURCES += main.cpp\ + mainwindow.cpp + +HEADERS += mainwindow.h + +FORMS += mainwindow.ui + +win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../lib/release -llimereport +else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../lib/debug -llimereport +else:unix:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../lib/debug -llimereport +else:unix:CONFIG(release, debug|release): LIBS += -L$$PWD/../../lib/release -llimereport + +INCLUDEPATH += $$PWD/../../include +DEPENDPATH += $$PWD/../../include + +RESOURCES += \ + r1.qrc + +win32 { + RC_FILE += mainicon.rc +} \ No newline at end of file diff --git a/demo/r1/r1.qrc b/demo/r1/r1.qrc new file mode 100644 index 0000000..1e604e8 --- /dev/null +++ b/demo/r1/r1.qrc @@ -0,0 +1,9 @@ + + + images/logo.png + main.ico + images/lr.png + lr1.ico + lr6.ico + + diff --git a/include/lrcallbackdatasourceintf.h b/include/lrcallbackdatasourceintf.h new file mode 100644 index 0000000..3259f4b --- /dev/null +++ b/include/lrcallbackdatasourceintf.h @@ -0,0 +1,24 @@ +#ifndef LRVIRTUALDATASOURCEINTF +#define LRVIRTUALDATASOURCEINTF +#include +namespace LimeReport { + +struct CallbackInfo{ + enum DataType{IsEmpty, HasNext, ColumnHeaderData, ColumnData}; + enum ChangePosType{First, Next}; + DataType dataType; + int index; + QString columnName; +}; + +class ICallbackDatasource :public QObject{ + Q_OBJECT +signals: + void getCallbackData(const LimeReport::CallbackInfo& info, QVariant& data); + void changePos(const LimeReport::CallbackInfo::ChangePosType& type, bool& result); +}; + +} + +#endif // LRVIRTUALDATASOURCEINTF + diff --git a/include/lrdatasourcemanagerintf.h b/include/lrdatasourcemanagerintf.h new file mode 100644 index 0000000..123f049 --- /dev/null +++ b/include/lrdatasourcemanagerintf.h @@ -0,0 +1,54 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATASOURCEMANAGERINTF_H +#define LRDATASOURCEMANAGERINTF_H + +#include "lrcallbackdatasourceintf.h" + +class QVariant; +class QString; +class QAbstractItemModel; +namespace LimeReport{ + +class IDataSourceManager{ +public: + virtual void setReportVariable(const QString& name, const QVariant& value)=0; + virtual void deleteVariable(const QString& name)=0; + virtual bool containsVariable(const QString& variableName)=0; + virtual QVariant variable(const QString& variableName)=0; + virtual void addModel(const QString& name, QAbstractItemModel *model, bool owned)=0; + virtual bool containsDatasource(const QString& dataSourceName)=0; + virtual void clearUserVariables()=0; + virtual ICallbackDatasource* createCallbackDatasouce(const QString& name) = 0; + virtual void addCallbackDatasource(ICallbackDatasource* datasource, const QString& name) = 0; +}; + +} +#endif // LRDATASOURCEMANAGERINTF_H diff --git a/include/lrglobal.cpp b/include/lrglobal.cpp new file mode 100644 index 0000000..34bd880 --- /dev/null +++ b/include/lrglobal.cpp @@ -0,0 +1,40 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include "lrglobal.h" + +QString LimeReport::extractClassName(QString className) +{ + int startPos=className.lastIndexOf("::"); + if(startPos==-1) startPos=0; + else startPos+=2; + return className.right(className.length()-startPos); +} diff --git a/include/lrglobal.h b/include/lrglobal.h new file mode 100644 index 0000000..a701619 --- /dev/null +++ b/include/lrglobal.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef GLOBAL_H +#define GLOBAL_H +#include "qglobal.h" +#include +#include + +#if defined(LIMEREPORT_EXPORTS) +# define LIMEREPORT_EXPORT Q_DECL_EXPORT +#elif defined (LIMEREPORT_IMPORTS) +# define LIMEREPORT_EXPORT Q_DECL_IMPORT +#else +# define LIMEREPORT_EXPORT /**/ +#endif + +namespace LimeReport { + const qreal fontFACTOR = 3.5; + const int mmFACTOR = 10; + const int itemPaleteIconSize = 24; + const qreal minSpaceBorder = 10; + QString extractClassName(QString className); + const QString bandTAG = "band"; + const qreal BAND_MARKER_OPACITY = 1; + const qreal LAYOUT_MARKER_OPACITY = 0.3; + const qreal BAND_NAME_AREA_OPACITY = 0.3; + const qreal BAND_NAME_TEXT_OPACITY = 0.6; + const qreal SELECTION_OPACITY = 0.3; + enum RenderPass {FirstPass, SecondPass}; + enum ArrangeType {AsNeeded, Force}; + const QString FIELD_RX = "\\$D\\s*\\{\\s*([^\\s{}]*)\\s*\\}"; + const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^\\s{}]*)\\s*\\}"; + const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; + const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)"; + const int DATASOURCE_INDEX = 6; + const int VALUE_INDEX = 2; + const QString GROUP_FUNCTION_RX = "(%1\\s*"+GROUP_FUNCTION_PARAM_RX+")"; + const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; + const int SCENE_MARGIN = 50; + class ReportError : public std::runtime_error{ + public: + ReportError(const QString& message):std::runtime_error(message.toStdString()){} + }; + +} // namespace LimeReport + + + +#endif // GLOBAL_H diff --git a/include/lrreportengine.h b/include/lrreportengine.h new file mode 100644 index 0000000..924976a --- /dev/null +++ b/include/lrreportengine.h @@ -0,0 +1,105 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTDESIGNINTF_H +#define LRREPORTDESIGNINTF_H + +#include +#include +#include + +#include "lrglobal.h" +#include "lrdatasourcemanagerintf.h" +#include "lrscriptenginemanagerintf.h" +//#include "lrreportrender.h" + +class QPrinter; + +namespace LimeReport { + + +class PrintRange{ +public: + int fromPage() const { return m_fromPage;} + int toPage() const { return m_toPage;} + QPrintDialog::PrintRange rangeType() const { return m_rangeType;} + PrintRange(QAbstractPrintDialog::PrintRange rangeType=QPrintDialog::AllPages, int fromPage=0, int toPage=0); + void setRangeType(QAbstractPrintDialog::PrintRange rangeType){ m_rangeType=rangeType;} + void setFromPage(int fromPage){ m_fromPage = fromPage;} + void setToPage(int toPage){ m_toPage = toPage;} +private: + QPrintDialog::PrintRange m_rangeType; + int m_fromPage; + int m_toPage; +}; + +class DataSourceManager; +class ReportEnginePrivate; +//class PageDesignIntf; + +class LIMEREPORT_EXPORT ReportEngine : public QObject{ + Q_OBJECT +public: + static void setSettings(QSettings *value){m_settings=value;} +public: + explicit ReportEngine(QObject *parent = 0); + ~ReportEngine(); + bool printReport(QPrinter *printer=0); + //void printReport(ReportPages pages, QPrinter &printer); + void printToFile(const QString& fileName); + //PageDesignIntf *createPreviewScene(QObject *parent = 0); + void previewReport(); + void designReport(); + void setShowProgressDialog(bool value); + IDataSourceManager* dataManager(); + IScriptEngineManager* scriptManager(); + + bool loadFromFile(const QString& fileName); + bool loadFromByteArray(QByteArray *data); + QString reportFileName(); + bool saveToFile(); + bool saveToFile(const QString& fileName); + QString lastError(); +signals: + void renderStarted(); + void renderFinished(); + void renderPageFinished(int renderedPageCount); +public slots: + void cancelRender(); +protected: + ReportEnginePrivate * const d_ptr; + ReportEngine(ReportEnginePrivate &dd, QObject * parent=0); +private: + Q_DECLARE_PRIVATE(ReportEngine) + static QSettings* m_settings; +}; + +} // namespace LimeReport + +#endif // LRREPORTDESIGNINTF_H diff --git a/include/lrscriptenginemanagerintf.h b/include/lrscriptenginemanagerintf.h new file mode 100644 index 0000000..56284da --- /dev/null +++ b/include/lrscriptenginemanagerintf.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSCRIPTENGINEMANAGERINTF_H +#define LRSCRIPTENGINEMANAGERINTF_H + +#include + +namespace LimeReport{ + +class IScriptEngineManager{ +public: + virtual QScriptEngine* scriptEngine() = 0; + virtual QScriptValue addFunction(const QString& name, QScriptEngine::FunctionSignature function, + const QString& category="", const QString& description="") = 0; + virtual QScriptValue addFunction(const QString &name, const QString& script, + const QString &category="", const QString &description="") = 0; + virtual const QString& lastError() const = 0; + virtual ~IScriptEngineManager(){} +}; + +} //namespace LimeReport +#endif // LRSCRIPTENGINEMANAGERINTF_H diff --git a/lib/.gitignore b/lib/.gitignore new file mode 100644 index 0000000..591459e --- /dev/null +++ b/lib/.gitignore @@ -0,0 +1,5 @@ +release/* +debug/* +*.so.1.0.0.debug +*.so.1.0.0 +/ReportGenerator.app/ diff --git a/limereport.pro b/limereport.pro new file mode 100644 index 0000000..6ae3a53 --- /dev/null +++ b/limereport.pro @@ -0,0 +1,45 @@ +#CONFIG +=zint +#QMAKE_CFLAGS += -std=c99 +#ZINT_PATH = $$PWD/../zint-2.4.3 +#ZINT_VERSION = 2.4.3 +#include(qzint.pri) +include(report-lib.pri) + +TEMPLATE = lib +QT += core xml sql script +TARGET = limereport + +DEFINES += LIMEREPORT_EXPORTS + +EXTRA_FILES += \ + $$PWD/src/lrglobal.cpp \ + $$PWD/src/lrglobal.h \ + $$PWD/src/lrdatasourcemanagerintf.h \ + $$PWD/src/lrreportengine.h \ + $$PWD/src/lrscriptenginemanagerintf.h \ + $$PWD/src/lrcallbackdatasourceintf.h + +DEST_DIR = $$PWD/include/ + +unix { + for(FILE,EXTRA_FILES){ + QMAKE_POST_LINK += $$quote($$QMAKE_COPY $${FILE} $${DEST_DIR}$$escape_expand(\n\t)) + } +} + +win32 { + EXTRA_FILES ~= s,/,\\,g + DEST_DIR ~= s,/,\\,g + for(FILE,EXTRA_FILES){ + QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($$DEST_DIR) $$escape_expand(\\n\\t) + } +} + +DESTDIR = $$PWD/lib + +DEPENDPATH += report report/bands report/base report/databrowser report/items report/objectinspector +INCLUDEPATH += report report/bands report/base report/databrowser report/items report/objectinspector + +CONFIG(release, debug|release): DESTDIR = $$PWD/lib/release/ +else:CONFIG(debug, debug|release): DESTDIR = $$PWD/lib/debug/ + diff --git a/qzint.pri b/qzint.pri new file mode 100644 index 0000000..51a6a50 --- /dev/null +++ b/qzint.pri @@ -0,0 +1,64 @@ +DEFINES += _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ZINT_VERSION=\\\"$$ZINT_VERSION\\\" NO_PNG + +!contains(DEFINES, NO_PNG) { + LIBS += -lpng +} + +INCLUDEPATH += \ + $$ZINT_PATH/backend \ + $$ZINT_PATH/backend_qt4 + +HEADERS += $$ZINT_PATH/backend/aztec.h \ + $$ZINT_PATH/backend/code1.h \ + $$ZINT_PATH/backend/code49.h \ + $$ZINT_PATH/backend/common.h \ + $$ZINT_PATH/backend/composite.h \ + $$ZINT_PATH/backend/dmatrix.h \ + $$ZINT_PATH/backend/font.h \ + $$ZINT_PATH/backend/gb2312.h \ + $$ZINT_PATH/backend/gridmtx.h \ + $$ZINT_PATH/backend/gs1.h \ + $$ZINT_PATH/backend/large.h \ + $$ZINT_PATH/backend/maxicode.h \ + $$ZINT_PATH/backend/maxipng.h \ + $$ZINT_PATH/backend/ms_stdint.h \ + $$ZINT_PATH/backend/pdf417.h \ + $$ZINT_PATH/backend/qr.h \ + $$ZINT_PATH/backend/reedsol.h \ + $$ZINT_PATH/backend/rss.h \ + $$ZINT_PATH/backend/sjis.h \ + $$ZINT_PATH/backend/zint.h \ + $$ZINT_PATH/backend_qt4/qzint.h + +SOURCES += $$ZINT_PATH/backend/2of5.c \ + $$ZINT_PATH/backend/auspost.c \ + $$ZINT_PATH/backend/aztec.c \ + $$ZINT_PATH/backend/code.c \ + $$ZINT_PATH/backend/code1.c \ + $$ZINT_PATH/backend/code128.c \ + $$ZINT_PATH/backend/code16k.c \ + $$ZINT_PATH/backend/code49.c \ + $$ZINT_PATH/backend/common.c \ + $$ZINT_PATH/backend/composite.c \ + $$ZINT_PATH/backend/dmatrix.c \ + $$ZINT_PATH/backend/gridmtx.c \ + $$ZINT_PATH/backend/gs1.c \ + $$ZINT_PATH/backend/imail.c \ + $$ZINT_PATH/backend/large.c \ + $$ZINT_PATH/backend/library.c \ + $$ZINT_PATH/backend/maxicode.c \ + $$ZINT_PATH/backend/medical.c \ + $$ZINT_PATH/backend/pdf417.c \ + $$ZINT_PATH/backend/plessey.c \ + $$ZINT_PATH/backend/postal.c \ + $$ZINT_PATH/backend/ps.c \ + $$ZINT_PATH/backend/qr.c \ + $$ZINT_PATH/backend/reedsol.c \ + $$ZINT_PATH/backend/render.c \ + $$ZINT_PATH/backend/rss.c \ + $$ZINT_PATH/backend/svg.c \ + $$ZINT_PATH/backend/telepen.c \ + $$ZINT_PATH/backend/upcean.c \ + $$ZINT_PATH/backend/dllversion.c \ + $$ZINT_PATH/backend/png.c \ + $$ZINT_PATH/backend_qt4/qzint.cpp diff --git a/report-lib.pri b/report-lib.pri new file mode 100644 index 0000000..5563ea5 --- /dev/null +++ b/report-lib.pri @@ -0,0 +1,228 @@ +QT += script xml sql +REPORT_PATH = $$PWD + +LIMEREPORT_VERSION_MAJOR = 1 +LIMEREPORT_VERSION_MINOR = 0 +LIMEREPORT_VERSION_RELEASE = 1 + +LIMEREPORT_VERSION = '\\"$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}\\"' +DEFINES += LIMEREPORT_VERSION_STR=\"$${LIMEREPORT_VERSION}\" +DEFINES += LIMEREPORT_VERSION=$${LIMEREPORT_VERSION} + +greaterThan(QT_MAJOR_VERSION, 4) { + DEFINES+=HAVE_QT5 + QT+= printsupport widgets + + contains(QT,uitools){ + message(uitools) + DEFINES += HAVE_UI_LOADER + } +} + +lessThan(QT_MAJOR_VERSION, 5){ + CONFIG(uitools){ + message(uitools) + DEFINES += HAVE_UI_LOADER + } +} + +DEFINES += INSPECT_BASEDESIGN + +REPORT_PATH = $$PWD/src + +INCLUDEPATH += \ + $$REPORT_PATH/ \ + $$REPORT_PATH/items \ + $$REPORT_PATH/bands \ + $$REPORT_PATH/base \ + $$REPORT_PATH/objectinspector \ + $$REPORT_PATH/databrowser + +SOURCES += \ + $$REPORT_PATH/items/lrtextitem.cpp \ + $$REPORT_PATH/bands/lrpageheader.cpp \ + $$REPORT_PATH/bands/lrpagefooter.cpp \ + $$REPORT_PATH/bands/lrreportheader.cpp \ + $$REPORT_PATH/bands/lrreportfooter.cpp \ + $$REPORT_PATH/bands/lrdataband.cpp \ + $$REPORT_PATH/bands/lrgroupbands.cpp \ + $$REPORT_PATH/bands/lrsubdetailband.cpp \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ + $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ + $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ + $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ + $$REPORT_PATH/serializators/lrxmlreader.cpp \ + $$REPORT_PATH/serializators/lrxmlwriter.cpp \ + $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ + $$REPORT_PATH/items/lralignpropitem.cpp \ + $$REPORT_PATH/items/lrhorizontallayout.cpp \ + $$REPORT_PATH/items/editors/lritemeditorwidget.cpp \ + $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ + $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ + $$REPORT_PATH/items/lrsimpletagparser.cpp \ + $$REPORT_PATH/items/lrimageitem.cpp \ + $$REPORT_PATH/items/lrtextitemeditor.cpp \ + $$REPORT_PATH/items/lrshapeitem.cpp \ + $$REPORT_PATH/lrbanddesignintf.cpp \ + $$REPORT_PATH/lrpageitemdesignintf.cpp \ + $$REPORT_PATH/lrpagedesignintf.cpp \ + $$REPORT_PATH/lrbandsmanager.cpp \ + $$REPORT_PATH/lrglobal.cpp \ + $$REPORT_PATH/lritemdesignintf.cpp \ + $$REPORT_PATH/lrdatadesignintf.cpp \ + $$REPORT_PATH/lrreportdesignwidget.cpp \ + $$REPORT_PATH/lrbasedesignintf.cpp \ + $$REPORT_PATH/lrreportengine.cpp \ + $$REPORT_PATH/lrdatasourcemanager.cpp \ + $$REPORT_PATH/lrreportdesignwindow.cpp \ + $$REPORT_PATH/waitform.cpp \ + $$REPORT_PATH/lrreportrender.cpp \ + $$REPORT_PATH/lrscriptenginemanager.cpp \ + $$REPORT_PATH/lrpreviewreportwindow.cpp \ + $$REPORT_PATH/lrvariablesholder.cpp \ + $$REPORT_PATH/lrgroupfunctions.cpp \ + $$REPORT_PATH/lrsimplecrypt.cpp \ + $$REPORT_PATH/lraboutdialog.cpp + +contains(CONFIG, zint){ + SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp +} + +HEADERS += \ + $$REPORT_PATH/base/lrsingleton.h \ + $$REPORT_PATH/bands/lrpageheader.h \ + $$REPORT_PATH/bands/lrpagefooter.h \ + $$REPORT_PATH/bands/lrreportheader.h \ + $$REPORT_PATH/bands/lrreportfooter.h \ + $$REPORT_PATH/bands/lrdataband.h \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ + $$REPORT_PATH/databrowser/lrdatabrowser.h \ + $$REPORT_PATH/databrowser/lrsqleditdialog.h \ + $$REPORT_PATH/databrowser/lrconnectiondialog.h \ + $$REPORT_PATH/databrowser/lrvariabledialog.h \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ + $$REPORT_PATH/lrbanddesignintf.h \ + $$REPORT_PATH/lrpageitemdesignintf.h \ + $$REPORT_PATH/lrbandsmanager.h \ + $$REPORT_PATH/lrglobal.h \ + $$REPORT_PATH/base/lrsimpleabstractfactory.h \ + $$REPORT_PATH/base/lrattribsabstractfactory.h \ + $$REPORT_PATH/serializators/lrserializatorintf.h \ + $$REPORT_PATH/serializators/lrstorageintf.h \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ + $$REPORT_PATH/serializators/lrxmlserializatorsfactory.h \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ + $$REPORT_PATH/serializators/lrxmlreader.h \ + $$REPORT_PATH/serializators/lrxmlwriter.h \ + $$REPORT_PATH/lrbasedesignintf.h \ + $$REPORT_PATH/lritemdesignintf.h \ + $$REPORT_PATH/lrdesignelementsfactory.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ + $$REPORT_PATH/items/lrtextitem.h \ + $$REPORT_PATH/items/lrsubitemparentpropitem.h \ + $$REPORT_PATH/items/lralignpropitem.h \ + $$REPORT_PATH/items/lrhorizontallayout.h \ + $$REPORT_PATH/items/editors/lritemeditorwidget.h \ + $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ + $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ + $$REPORT_PATH/lrdatadesignintf.h \ + $$REPORT_PATH/lrcollection.h \ + $$REPORT_PATH/lrpagedesignintf.h \ + $$REPORT_PATH/lrreportdesignwidget.h \ + $$REPORT_PATH/lrreportengine_p.h \ + $$REPORT_PATH/lrdatasourcemanager.h \ + $$REPORT_PATH/lrreportdesignwindow.h \ + $$REPORT_PATH/waitform.h \ + $$REPORT_PATH/items/lrsimpletagparser.h \ + $$REPORT_PATH/bands/lrsubdetailband.h \ + $$REPORT_PATH/lrreportrender.h \ + $$REPORT_PATH/lrpreviewreportwindow.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ + $$REPORT_PATH/items/lrimageitem.h \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ + $$REPORT_PATH/items/lrtextitemeditor.h \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ + $$REPORT_PATH/lrscriptenginemanager.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ + $$REPORT_PATH/items/lrshapeitem.h \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ + $$REPORT_PATH/bands/lrgroupbands.h \ + $$REPORT_PATH/lrvariablesholder.h \ + $$REPORT_PATH/lrgroupfunctions.h \ + $$REPORT_PATH/lrreportengine.h \ + $$REPORT_PATH/lrdatasourcemanagerintf.h \ + $$REPORT_PATH/lrscriptenginemanagerintf.h \ + $$REPORT_PATH/lrsimplecrypt.h \ + $$REPORT_PATH/lraboutdialog.h \ + $$REPORT_PATH/lrcallbackdatasourceintf.h + +contains(CONFIG,zint){ + HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h +} + +FORMS += \ + $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ + $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ + $$REPORT_PATH/databrowser/lrdatabrowser.ui \ + $$REPORT_PATH/databrowser/lrvariabledialog.ui \ + $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ + $$REPORT_PATH/waitform.ui \ + $$REPORT_PATH/lrpreviewreportwindow.ui \ + $$REPORT_PATH/items/lrtextitemeditor.ui \ + $$REPORT_PATH/lraboutdialog.ui + +RESOURCES += \ + $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ + $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ + $$REPORT_PATH/report.qrc \ + $$REPORT_PATH/items/items.qrc diff --git a/report-lib_ru.ts b/report-lib_ru.ts new file mode 100644 index 0000000..bc69495 --- /dev/null +++ b/report-lib_ru.ts @@ -0,0 +1,1466 @@ + + + + + ConnectionDialog + + + + Connection + Подключение + + + + Connection Name + Название соединения + + + + Driver + Драйвер + + + + Server + Сервер + + + + User + Пользователь + + + + Password + Пароль + + + + Database + База данных + + + + ... + + + + + Auto connect + Авто соединение + + + + Check connection + Проверить соединение + + + + Cancel + Отмена + + + + Ok + + + + + + Error + Ошибка + + + + Connection succsesfully established! + Соединение успешно установлено ! + + + + Connection Name is empty + Название соединения не указано + + + + Connection with name + Соединение с названием + + + + already exists + уже существует + + + + DataBrowser + + + + Datasources + + + + + Add database connection + + + + + + + + + + + + + + + + ... + + + + + Variables + + + + + LRVariableDialog + + + Variable + + + + + Name + + + + + Value + + + + + Type + + + + + Attention + + + + + LimeReport::AVariablesHolder + + + + + + variable with name + + + + + already exists !! + + + + + + + does not exists !! + + + + + LimeReport::AlignmentPropItem + + + Left + + + + + Right + + + + + + Center + + + + + Justify + + + + + Top + + + + + Botom + + + + + horizontal + + + + + vertical + + + + + LimeReport::ContentItemDesignIntf + + + Variable %1 not found + + + + + LimeReport::DataBand + + + Data + + + + + LimeReport::DataBrowser + + + Datasources + + + + + + + + Attention + + + + + Do you really want delete "%1" connection ? + + + + + User variables + + + + + System variables + + + + + Do you really want delete "%1" datasource ? + + + + + Do you really want delete variable "%1" ? + + + + + Error + + + + + LimeReport::DataSourceManager + + + + Datasource "%1" not found ! + + + + + connection with name "%1" already exists ! + + + + + data source with name "%1" already exists !! + + + + + datasource with name "%1"already exists !! + + + + + + datasource with name "%1" already exists !! + + + + + invalid connection + + + + + LimeReport::DataSourceModel + + + Datasources + + + + + Variables + + + + + LimeReport::FontEditorWidget + + + Font bold + + + + + Font Italic + + + + + Font Underline + + + + + LimeReport::FontPropItem + + + bold + + + + + italic + + + + + underline + + + + + size + + + + + family + + + + + LimeReport::GroupBandFooter + + + GroupFooter + + + + + LimeReport::GroupBandHeader + + + GroupHeader + + + + + LimeReport::GroupFunction + + + Field "%1" not found + + + + + Variable "%1" not found + + + + + Item "%1" not found + + + + + LimeReport::ItemsAlignmentEditorWidget + + + Bring to top + + + + + Send to back + + + + + Align to left + + + + + Align to right + + + + + Align to vertical center + + + + + Align to top + + + + + Align to bottom + + + + + Align to horizontal center + + + + + Set same height + + + + + Set same width + + + + + LimeReport::ItemsBordersEditorWidget + + + + + + Top line + + + + + No borders + + + + + All borders + + + + + LimeReport::MasterDetailProxyModel + + + Field: "%1" not found in "%2" child datasource + + + + + Field: "%1" not found in "%2" master datasource + + + + + LimeReport::ModelToDataSource + + + model i s destroyed + + + + + LimeReport::ObjectBrowser + + + Objects + + + + + LimeReport::PageDesignIntf + + + Attention! + + + + + Elements have different parent containers + + + + + LimeReport::PageFooter + + + Page Footer + + + + + LimeReport::PageHeader + + + Page Header + + + + + LimeReport::QObjectPropertyModel + + + Property Name + + + + + Property value + + + + + LimeReport::RectMMPropItem + + + + + width + + + + + + + height + + + + + LimeReport::RectPropItem + + + width + + + + + height + + + + + LimeReport::ReportDesignIntfPrivate + + + Error + + + + + LimeReport::ReportDesignWidget + + + + Page + + + + + Script + + + + + Report file name + + + + + Error + + + + + Wrong file format + + + + + LimeReport::ReportDesignWindow + + + New Report + + + + + New Report Page + + + + + Edit Mode + + + + + Undo + + + + + Redo + + + + + Copy + + + + + Paste + + + + + Cut + + + + + Text Item + + + + + Save Report + + + + + Save Report As + + + + + Load Report + + + + + Delete item + + + + + Zoom In + + + + + Zoom Out + + + + + Render Report + + + + + Edit layouts mode + + + + + Horizontal layout + + + + + Report Tools + + + + + Font + + + + + Text alignment + + + + + Items alignment + + + + + Borders + + + + + Report Header + + + + + Report Footer + + + + + Page Header + + + + + Page Footer + + + + + Data + + + + + SubDetail + + + + + SubDetailHeader + + + + + SubDetailFooter + + + + + GroupHeader + + + + + GroupFooter + + + + + File + + + + + Edit + + + + + Object Inspector + + + + + Report structure + + + + + Data Browser + + + + + Script Browser + + + + + Report has been modified ! Do you want save the report ? + + + + + + Report file name + + + + + LimeReport::ReportFooter + + + Report Footer + + + + + LimeReport::ReportHeader + + + Report Header + + + + + LimeReport::ReportRender + + + Error + + + + + Databand "%1" not found + + + + + Wrong using function %1 + + + + + LimeReport::ScriptBrowser + + + NO CATEGORY + + + + + + + Error + + + + + Dialog with name: %1 already exists + + + + + ui file must cointain QDialog instead QWidget or QMainWindow + + + + + wrong file format + + + + + LimeReport::ScriptEngineContext + + + Dialog with name: %1 can`t be created + + + + + LimeReport::SubDetailBand + + + SubDetail + + + + + LimeReport::TextAlignmentEditorWidget + + + Text align left + + + + + + Text align center + + + + + Text align right + + + + + Text align justify + + + + + Text align top + + + + + Text align bottom + + + + + PreviewReportWindow + + + Preview + + + + + View + + + + + Report + + + + + toolBar + + + + + Print + + + + + Ctrl+P + + + + + Zoom In + + + + + Zoom Out + + + + + + Prior Page + + + + + + Next Page + + + + + + Close Preview + + + + + Edit Mode + + + + + + Save to file + + + + + + Показать ошибки + + + + + Font + + + + + Text align + + + + + of %1 + + + + + Report file name + + + + + QObject + + + + Data + + + + + GroupHeader + + + + + GroupFooter + + + + + + Page Footer + + + + + + Page Header + + + + + + Report Footer + + + + + + Report Header + + + + + + SubDetail + + + + + SubDetailHeader + + + + + SubDetailFooter + + + + + alignment + + + + + Barcode Item + + + + + HLayout + + + + + Image Item + + + + + Shape Item + + + + + itemLocation + + + + + Text Item + + + + + Invalid connection! %1 + + + + + Master datasouce "%1" not found! + + + + + Child + + + + + and child + + + + + datasouce "%1" not found! + + + + + Function %1 not found or have wrong arguments + + + + + bool + + + + + QColor + + + + + + datasource + + + + + + field + + + + + enum + + + + + flags + + + + + QFont + + + + + QImage + + + + + int + + + + + qreal + + + + + QRect + + + + + QRectF + + + + + geometry + + + + + mm + + + + + QString + + + + + Wrong file format + + + + + File %1 not opened + + + + + Content string is empty + + + + + Content is empty + + + + + SQLEditDialog + + + Datasource + + + + + Connection + + + + + Datasource Name + + + + + Subdetail + + + + + Master datasource + + + + + Sub query mode + + + + + Filter mode + + + + + SQL + + + + + Child datasource + + + + + Fields map + + + + + + ... + + + + + Cancel + + + + + Ok + + + + + Error + + + + + Datasource Name is empty ! + + + + + SQL is empty ! + + + + + Datasource with name: "%1" already exists ! + + + + + Datasource with name %1 already exist + + + + + ScriptBrowser + + + Form + + + + + Functions + + + + + + + + + + ... + + + + + Dialogs + + + + + Type + + + + + Name + + + + + TextItemEditor + + + Text Item Editor + + + + + Content + + + + + Data + + + + + Functions + + + + + Editor settings + + + + + Editor font + + + + + ... + + + + + Ok + + + + + Cancel + + + + + Esc + + + + + WaitForm + + + Wait + + + + + Please wait ... + + + + diff --git a/src/acollection.cpp b/src/acollection.cpp new file mode 100644 index 0000000..5682a2b --- /dev/null +++ b/src/acollection.cpp @@ -0,0 +1,30 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "acollection.h" diff --git a/src/areportpreviewwidget.h b/src/areportpreviewwidget.h new file mode 100644 index 0000000..d36294e --- /dev/null +++ b/src/areportpreviewwidget.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef AREPORTPREVIEWINTF_H +#define AREPORTPREVIEWINTF_H + +#include +#include + +namespace ArReport{ + +class ReportPreviewWidgetIntf : public QWidget +{ + Q_OBJECT +public: + explicit ReportPreviewWidgetIntf(QWidget *parent=0); +private: + QGraphicsView* m_view; +}; + +} +#endif // AREPORTPREVIEWINTF_H diff --git a/src/bands/lrdataband.cpp b/src/bands/lrdataband.cpp new file mode 100644 index 0000000..3e04c0e --- /dev/null +++ b/src/bands/lrdataband.cpp @@ -0,0 +1,74 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrdataband.h" +#include "lrdesignelementsfactory.h" +#include "lrglobal.h" + +const QString xmlTag ="Data"; + +namespace{ + +LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::DataBand(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, + LimeReport::ItemAttribs(QObject::tr("Data"),LimeReport::bandTAG), + createBand + ); + +} + +namespace LimeReport { + +DataBand::DataBand(QObject *owner, QGraphicsItem *parent) + : DataBandDesignIntf(LimeReport::BandDesignIntf::Data,xmlTag,owner,parent) { + setBandTypeText(tr("Data")); + setFixedPos(false); + setMarkerColor(bandColor()); +} + +bool DataBand::isUnique() const +{ + return false; +} + +QColor DataBand::bandColor() const +{ + return QColor(Qt::darkGreen); +} + +BaseDesignIntf *DataBand::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new DataBand(owner,parent); +} + +} + diff --git a/src/bands/lrdataband.h b/src/bands/lrdataband.h new file mode 100644 index 0000000..cd5b580 --- /dev/null +++ b/src/bands/lrdataband.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATABAND_H +#define LRDATABAND_H + +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" +#include + +namespace LimeReport{ +class DataBand : public DataBandDesignIntf +{ + Q_OBJECT + Q_PROPERTY(bool keepSubdetailTogether READ tryToKeepTogether WRITE setTryToKeepTogether) + Q_PROPERTY(bool splittable READ isSplittable WRITE setSplittable ) + Q_PROPERTY(bool keepFooterTogether READ keepFooterTogether WRITE setKeepFooterTogether) + Q_PROPERTY(bool sliceLastRow READ sliceLastRow WRITE setSliceLastRow) +public: + DataBand(QObject* owner = 0, QGraphicsItem* parent=0); + bool isUnique() const; + bool isData() const {return true;} +protected: + QColor bandColor() const; +private: + BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); +}; +} +#endif // LRDATABAND_H diff --git a/src/bands/lrgroupbands.cpp b/src/bands/lrgroupbands.cpp new file mode 100644 index 0000000..54b559d --- /dev/null +++ b/src/bands/lrgroupbands.cpp @@ -0,0 +1,156 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrgroupbands.h" +#include "lrglobal.h" +#include "lrdatasourcemanager.h" + + +const QString xmlTagHeader = QLatin1String("GroupHeader"); +const QString xmlTagFooter = QLatin1String("GroupFooter"); + +namespace{ + +LimeReport::BaseDesignIntf* createHeader(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::GroupBandHeader(owner,parent); +} + +bool registredHeader = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTagHeader, + LimeReport::ItemAttribs(QObject::tr("GroupHeader"),LimeReport::bandTAG), + createHeader + ); + +LimeReport::BaseDesignIntf * createFooter(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::GroupBandFooter(owner,parent); +} + +bool registredFooter = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTagFooter, + LimeReport::ItemAttribs(QObject::tr("GroupFooter"),LimeReport::bandTAG), + createFooter + ); + +} + +namespace LimeReport{ + +GroupBandHeader::GroupBandHeader(QObject *owner, QGraphicsItem *parent) + : BandDesignIntf(BandDesignIntf::GroupHeader, xmlTagHeader, owner,parent), + m_groupFiledName(""), m_groupStarted(false) +{ + setBandTypeText(tr("GroupHeader")); + setFixedPos(false); + setMarkerColor(bandColor()); +} + +bool GroupBandHeader::isUnique() const +{ + return false; +} + +//bool GroupBandHeader::tryToKeepTogether() +//{ +// return m_tryToKeepTogether; +//} + +BaseDesignIntf *GroupBandHeader::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new GroupBandHeader(owner, parent); +} + +void GroupBandHeader::startGroup() +{ + m_groupStarted=true; + DataSourceManager* dm = DataSourceManager::instance(); + if ((dm->dataSource(parentBand()->datasourceName()))){ + IDataSource* ds = dm->dataSource(parentBand()->datasourceName()); + if (ds->columnIndexByName(m_groupFiledName)!=-1) + m_groupFieldValue=ds->data(m_groupFiledName); + } +} + +QColor GroupBandHeader::bandColor() const +{ + return QColor(Qt::darkBlue); +} + +bool GroupBandHeader::isNeedToClose() +{ + if (m_groupFieldValue.isNull()) return false; + + DataSourceManager* dm = DataSourceManager::instance(); + if ((dm->dataSource(parentBand()->datasourceName()))){ + IDataSource* ds = dm->dataSource(parentBand()->datasourceName()); + return ds->data(m_groupFiledName)!=m_groupFieldValue; + } + + return false; +} + +bool GroupBandHeader::isStarted() +{ + return !m_groupFieldValue.isNull(); +} + +void GroupBandHeader::closeGroup() +{ + m_groupFieldValue=QVariant(); + m_groupStarted=false; +} + +int GroupBandHeader::index() +{ + return bandIndex(); +} + +GroupBandFooter::GroupBandFooter(QObject *owner, QGraphicsItem *parent) + :BandDesignIntf(BandDesignIntf::GroupFooter, xmlTagFooter, owner,parent) +{ + setBandTypeText(tr("GroupFooter")); + setFixedPos(false); + setMarkerColor(bandColor()); +} + +bool GroupBandFooter::isUnique() const +{ + return false; +} + +QColor GroupBandFooter::bandColor() const +{ + return QColor(Qt::darkBlue); +} + +BaseDesignIntf *GroupBandFooter::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new GroupBandFooter(owner,parent); +} + +} //namespace LimeReport diff --git a/src/bands/lrgroupbands.h b/src/bands/lrgroupbands.h new file mode 100644 index 0000000..8520408 --- /dev/null +++ b/src/bands/lrgroupbands.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRGROUPBANDS_H +#define LRGROUPBANDS_H + +#include "lrbanddesignintf.h" +#include "lrdesignelementsfactory.h" + +namespace LimeReport{ + +class GroupBandHeader : public BandDesignIntf, public IGropBand{ + Q_OBJECT + Q_PROPERTY(QString groupFieldName READ groupFieldName WRITE setGroupFieldName) + Q_PROPERTY(bool splittable READ isSplittable WRITE setSplittable ) + Q_PROPERTY(bool keepGroupTogether READ tryToKeepTogether WRITE setTryToKeepTogether) +public: + GroupBandHeader(QObject* owner = 0, QGraphicsItem* parent=0); + virtual bool isUnique() const; + QVariant groupFieldValue(){return m_groupFieldValue;} + void setGroupFieldValue(QVariant value){m_groupFieldValue=value;} + QString groupFieldName(){return m_groupFiledName;} + void setGroupFieldName(QString fieldName){m_groupFiledName=fieldName;} + QColor bandColor() const; +private: + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); + virtual void startGroup(); + virtual bool isNeedToClose(); + virtual bool isStarted(); + virtual void closeGroup(); + virtual int index(); +private: + QVariant m_groupFieldValue; + QString m_groupFiledName; + bool m_groupStarted; +}; + +class GroupBandFooter : public BandDesignIntf{ + Q_OBJECT +public: + GroupBandFooter(QObject* owner = 0, QGraphicsItem* parent=0); + virtual bool isUnique() const; + QColor bandColor() const; + virtual bool isFooter() const{return true;} +private: + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); +}; + +} // namespace LimeReport +#endif // LRGROUPBANDS_H diff --git a/src/bands/lrpagefooter.cpp b/src/bands/lrpagefooter.cpp new file mode 100644 index 0000000..addefe7 --- /dev/null +++ b/src/bands/lrpagefooter.cpp @@ -0,0 +1,66 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrpagefooter.h" +#include "lrdesignelementsfactory.h" +#include "lrglobal.h" + +const QString xmlTag ="PageFooter"; + +namespace{ +LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::PageFooter(owner,parent); +} + +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, + LimeReport::ItemAttribs(QObject::tr("Page Footer"),LimeReport::bandTAG), + createBand + ); +} + +namespace LimeReport{ + +PageFooter::PageFooter(QObject *owner, QGraphicsItem *parent) + : BandDesignIntf(LimeReport::BandDesignIntf::PageFooter,xmlTag,owner,parent) { + setBandTypeText( tr("Page Footer") ); + setMarkerColor(bandColor()); +} + +BaseDesignIntf *PageFooter::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new PageFooter(owner,parent); +} + +QColor PageFooter::bandColor() const +{ + return QColor(246,120,12); +} + +} // namespace LimeReport diff --git a/src/bands/lrpagefooter.h b/src/bands/lrpagefooter.h new file mode 100644 index 0000000..8987317 --- /dev/null +++ b/src/bands/lrpagefooter.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRPAGEFOOTER_H +#define LRPAGEFOOTER_H + +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" +#include + +namespace LimeReport{ +class PageFooter : public LimeReport::BandDesignIntf +{ + Q_OBJECT +public: + PageFooter(QObject* owner = 0, QGraphicsItem* parent=0); + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); + virtual bool isFooter() const {return true;} +protected: + QColor bandColor() const; +}; +} + +#endif // LRPAGEFOOTER_H diff --git a/src/bands/lrpageheader.cpp b/src/bands/lrpageheader.cpp new file mode 100644 index 0000000..5b41734 --- /dev/null +++ b/src/bands/lrpageheader.cpp @@ -0,0 +1,70 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrpageheader.h" +#include "lrdesignelementsfactory.h" +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" +#include "lrpageitemdesignintf.h" +#include "lrglobal.h" + +const QString xmlTag ="PageHeader"; + +namespace{ + +LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::PageHeader(owner,parent); +} + +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, + LimeReport::ItemAttribs(QObject::tr("Page Header"),LimeReport::bandTAG), + createBand + ); +} + +namespace LimeReport{ + +PageHeader::PageHeader(QObject* owner, QGraphicsItem *parent) +: BandDesignIntf(LimeReport::BandDesignIntf::PageHeader,xmlTag,owner,parent) { + setBandTypeText(tr("Page Header")); + setMarkerColor(bandColor()); +} + +BaseDesignIntf *PageHeader::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new PageHeader(owner,parent); +} + +QColor PageHeader::bandColor() const +{ + return QColor(246,120,12); +} + +} diff --git a/src/bands/lrpageheader.h b/src/bands/lrpageheader.h new file mode 100644 index 0000000..dbbb6f5 --- /dev/null +++ b/src/bands/lrpageheader.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRPAGEHEADER_H +#define LRPAGEHEADER_H + +#include +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" + +namespace LimeReport { +class PageHeader : public LimeReport::BandDesignIntf +{ + Q_OBJECT +public: + PageHeader(QObject* owner = 0, QGraphicsItem* parent=0); +protected: + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); + QColor bandColor() const; +}; +} +#endif // LRPAGEHEADER_H diff --git a/src/bands/lrreportfooter.cpp b/src/bands/lrreportfooter.cpp new file mode 100644 index 0000000..66f6694 --- /dev/null +++ b/src/bands/lrreportfooter.cpp @@ -0,0 +1,71 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrreportfooter.h" +#include "lrdesignelementsfactory.h" +#include "lrglobal.h" + +const QString xmlTag ="ReportFooter"; + +namespace{ + +LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::ReportFooter(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, + LimeReport::ItemAttribs(QObject::tr("Report Footer"),LimeReport::bandTAG), + createBand + ); +} + +namespace LimeReport{ + +ReportFooter::ReportFooter(QObject *owner, QGraphicsItem *parent) + : BandDesignIntf(LimeReport::BandDesignIntf::ReportFooter,xmlTag,owner,parent) { + setBandTypeText(tr("Report Footer")); + setMarkerColor(bandColor()); +} + +BaseDesignIntf *ReportFooter::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new ReportFooter(owner,parent); +} + +QColor ReportFooter::bandColor() const +{ + return QColor(152,69,167); +} + +bool ReportFooter::isFooter() const +{ + return true; +} + +} diff --git a/src/bands/lrreportfooter.h b/src/bands/lrreportfooter.h new file mode 100644 index 0000000..140ad1e --- /dev/null +++ b/src/bands/lrreportfooter.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTFOOTER_H +#define LRREPORTFOOTER_H + +#include +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" + +namespace LimeReport{ +class ReportFooter : public BandDesignIntf +{ + Q_OBJECT + Q_PROPERTY(int maxScalePercent READ maxScalePercent WRITE setMaxScalePercent) + Q_PROPERTY(bool splittable READ isSplittable WRITE setSplittable) +public: + ReportFooter(QObject* owner=0, QGraphicsItem* parent=0); + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); +protected: + QColor bandColor() const; + bool isFooter() const; +}; +} +#endif // LRREPORTFOOTER_H diff --git a/src/bands/lrreportheader.cpp b/src/bands/lrreportheader.cpp new file mode 100644 index 0000000..aa261fc --- /dev/null +++ b/src/bands/lrreportheader.cpp @@ -0,0 +1,64 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrreportheader.h" +#include "lrdesignelementsfactory.h" +#include "lrglobal.h" + +const QString xmlTag ="ReportHeader"; + +namespace{ +LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::ReportHeader(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, + LimeReport::ItemAttribs(QObject::tr("Report Header"),LimeReport::bandTAG), + createBand + ); +} +namespace LimeReport { + +ReportHeader::ReportHeader(QObject *owner, QGraphicsItem *parent) + : BandDesignIntf(LimeReport::BandDesignIntf::ReportHeader,xmlTag,owner,parent) { + setBandTypeText(tr("Report Header")); + setMarkerColor(bandColor()); +} +BaseDesignIntf *ReportHeader::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new ReportHeader(owner,parent); +} + +QColor ReportHeader::bandColor() const +{ + return QColor(152,69,167); +} + +} + diff --git a/src/bands/lrreportheader.h b/src/bands/lrreportheader.h new file mode 100644 index 0000000..bc70667 --- /dev/null +++ b/src/bands/lrreportheader.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTHEADER_H +#define LRREPORTHEADER_H + +#include +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" + +namespace LimeReport{ +class ReportHeader : public LimeReport::BandDesignIntf +{ + Q_OBJECT + Q_PROPERTY(bool splittable READ isSplittable WRITE setSplittable ) +public: + ReportHeader(QObject* owner = 0, QGraphicsItem *parent=0); + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); +protected: + QColor bandColor() const; +}; +} +#endif // LRREPORTHEADER_H diff --git a/src/bands/lrsubdetailband.cpp b/src/bands/lrsubdetailband.cpp new file mode 100644 index 0000000..d1844fe --- /dev/null +++ b/src/bands/lrsubdetailband.cpp @@ -0,0 +1,153 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrsubdetailband.h" +#include "lrdesignelementsfactory.h" +#include "lrglobal.h" + + +const QString xmlTagBand = QLatin1String("SubDetail"); +const QString xmlTagHeader = QLatin1String("SubDetailHeader"); +const QString xmlTagFooter = QLatin1String("SubDetailFooter"); +const QColor BAND_COLOR = Qt::red; + +namespace{ + +LimeReport::BaseDesignIntf * createBand(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::SubDetailBand(owner,parent); +} + +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTagBand, + LimeReport::ItemAttribs(QObject::tr("SubDetail"),LimeReport::bandTAG), + createBand + ); + +LimeReport::BaseDesignIntf * createHeader(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::SubDetailHeaderBand(owner,parent); +} + +bool registredHeader = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTagHeader, + LimeReport::ItemAttribs(QObject::tr("SubDetailHeader"),LimeReport::bandTAG), + createHeader + ); + +LimeReport::BaseDesignIntf * createFooter(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::SubDetailFooterBand(owner,parent); +} + +bool registredFooter = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTagFooter, + LimeReport::ItemAttribs(QObject::tr("SubDetailFooter"),LimeReport::bandTAG), + createFooter + ); + +} // namespace + +namespace LimeReport{ + +//SubDetailBand + +SubDetailBand::SubDetailBand(QObject *owner, QGraphicsItem *parent) + : DataBandDesignIntf(BandDesignIntf::SubDetailBand, xmlTagBand, owner,parent) +{ + setBandTypeText(tr("SubDetail")); + setFixedPos(false); + setMarkerColor(bandColor()); +} + +bool SubDetailBand::isHasHeader() const +{ + return isConnectedToBand(BandDesignIntf::SubDetailHeader); +} + +bool SubDetailBand::isHasFooter() const +{ + return isConnectedToBand(BandDesignIntf::SubDetailFooter); +} + +BaseDesignIntf *SubDetailBand::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new SubDetailBand(owner,parent); +} + +QColor SubDetailBand::bandColor() const +{ + return BAND_COLOR; +} + +//SubDetailHeaderBand + +SubDetailHeaderBand::SubDetailHeaderBand(QObject *owner, QGraphicsItem *parent) + :BandDesignIntf(BandDesignIntf::SubDetailHeader,xmlTagHeader,owner,parent), m_printAlways(false) +{ + setMarkerColor(bandColor()); +} + +bool SubDetailHeaderBand::isUnique() const +{ + return false; +} + +QColor SubDetailHeaderBand::bandColor() const +{ + return BAND_COLOR; +} + +BaseDesignIntf *SubDetailHeaderBand::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new SubDetailHeaderBand(owner,parent); +} + +//SubDetailFooterBand + +SubDetailFooterBand::SubDetailFooterBand(QObject *owner, QGraphicsItem *parent) + : BandDesignIntf(BandDesignIntf::SubDetailFooter,xmlTagFooter,owner,parent), m_printAlways(false) +{ + setMarkerColor(bandColor()); +} + +bool SubDetailFooterBand::isUnique() const +{ + return false; +} + +QColor SubDetailFooterBand::bandColor() const +{ + return BAND_COLOR; +} + +BaseDesignIntf *SubDetailFooterBand::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new SubDetailFooterBand(owner,parent); +} + + +} diff --git a/src/bands/lrsubdetailband.h b/src/bands/lrsubdetailband.h new file mode 100644 index 0000000..3bfe1b4 --- /dev/null +++ b/src/bands/lrsubdetailband.h @@ -0,0 +1,89 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSUBDETAILBAND_H +#define LRSUBDETAILBAND_H + +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" + +namespace LimeReport{ + +class SubDetailBand : public DataBandDesignIntf +{ + Q_OBJECT + Q_PROPERTY(bool splittable READ isSplittable WRITE setSplittable) +public: + SubDetailBand(QObject* owner = 0, QGraphicsItem* parent=0); + bool isUnique() const {return false;} + bool isHasHeader() const; + bool isHasFooter() const; +private: + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); +protected: + virtual QColor bandColor() const; +}; + +class SubDetailHeaderBand : public BandDesignIntf +{ + Q_OBJECT + Q_PROPERTY(bool printAlways READ printAlways() WRITE setPrintAlways()) +public: + SubDetailHeaderBand(QObject* owner = 0, QGraphicsItem* parent=0); + virtual bool isUnique() const; + void setPrintAlways(bool value){m_printAlways=value;} + bool printAlways(){return m_printAlways;} +protected: + virtual QColor bandColor() const; +private: + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); +private: + bool m_printAlways; +}; + +class SubDetailFooterBand : public BandDesignIntf +{ + Q_OBJECT + Q_PROPERTY(bool printAlways READ printAlways() WRITE setPrintAlways()) +public: + SubDetailFooterBand(QObject* owner = 0, QGraphicsItem* parent=0); + void setPrintAlways(bool value){m_printAlways=value;} + bool printAlways(){return m_printAlways;} + virtual bool isUnique() const; + virtual bool isFooter() const{return true;} +protected: + virtual QColor bandColor() const; +private: + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); +private: + bool m_printAlways; +}; + +} +#endif // LRSUBDETAILBAND_H diff --git a/src/base/lrattribsabstractfactory.h b/src/base/lrattribsabstractfactory.h new file mode 100644 index 0000000..d760aa5 --- /dev/null +++ b/src/base/lrattribsabstractfactory.h @@ -0,0 +1,82 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRATTRIBABSTRACTFACTORY_H +#define LRATTRIBABSTRACTFACTORY_H + +#include "lrsingleton.h" +#include "lrglobal.h" +#include +#include +#include + +namespace LimeReport{ + +template +< + typename AbstractProduct, + typename IdentifierType, + typename ProductCreator, + typename Attribs +> +class AttribsAbstractFactory + : public Singleton< AttribsAbstractFactory< AbstractProduct,IdentifierType,ProductCreator,Attribs > > +{ +private: + typedef QMap FactoryMap; + typedef QMap AliasMap; + friend class Singleton< AttribsAbstractFactory< AbstractProduct,IdentifierType,ProductCreator,Attribs > >; +public: + bool registerCreator(const IdentifierType& id, Attribs attribs, ProductCreator creator){ + return (m_factoryMap.insert(id,creator).value()==creator)&& + (m_attribsMap.insert(id,attribs).value()==attribs); + } + bool unregisterCreator(const IdentifierType& id){ + return (m_factoryMap.remove(id)==1)&&(m_attribsMap.remove(id)==1); + } + ProductCreator objectCreator(const IdentifierType& id){ + if (m_factoryMap.contains(id)){ + return m_factoryMap[id]; + } else return 0; + } + QString attribs(const IdentifierType& id){ + if (m_attribsMap.contains(id)){ + return m_attribsMap.value(id); + } else return ""; + } + const FactoryMap& map(){return m_factoryMap;} + const AliasMap& attribsMap(){return m_attribsMap;} + int mapElementCount(){return m_factoryMap.count();} +private: + FactoryMap m_factoryMap; + AliasMap m_attribsMap; +}; + +} +#endif // LRATTRIBABSTRACTFACTORY_H diff --git a/src/base/lrsimpleabstractfactory.h b/src/base/lrsimpleabstractfactory.h new file mode 100644 index 0000000..3722a8b --- /dev/null +++ b/src/base/lrsimpleabstractfactory.h @@ -0,0 +1,103 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSIMPLEABSTRACTFACTORY_H +#define LRSIMPLEABSTRACTFACTORY_H + +#include "lrsingleton.h" +#include "lrglobal.h" +#include +#include +#include +#include +namespace LimeReport{ + +template +< + typename AbstractProduct, + typename IdentifierType, + typename ProductCreator +> +class SimpleAbstractFactory + : public Singleton< SimpleAbstractFactory< AbstractProduct,IdentifierType,ProductCreator > > +{ +private: + typedef QHash FactoryMap; + friend class Singleton< SimpleAbstractFactory< AbstractProduct,IdentifierType,ProductCreator > >; +public: + bool registerCreator(const IdentifierType& id, ProductCreator creator){ + return (m_factoryMap.insert(id,creator).value()==creator); + } + bool unregisterCreator(const IdentifierType& id){ + return (m_factoryMap.remove(id)==1); + } + ProductCreator objectCreator(const IdentifierType& id){ + if (m_factoryMap.contains(id)){ + return m_factoryMap[id]; + } else { + return 0; + } + } + const FactoryMap& map(){return m_factoryMap;} + int mapElementCount(){return m_factoryMap.count();} +private: + FactoryMap m_factoryMap; +}; + +template +< + typename AbstractProduct, + typename IdentifierType, + typename ProductCreator, + typename Attribs +> +class AttribAbstractFactory : public SimpleAbstractFactory< AbstractProduct,IdentifierType,ProductCreator >{ + typedef SimpleAbstractFactory< AbstractProduct,IdentifierType,ProductCreator > SimpleFactory; + typedef QMap AliasMap; + friend class Singleton >; +public : + bool registerCreator(const IdentifierType &id, Attribs attribs, ProductCreator creator){ + return SimpleFactory::registerCreator(id,creator) && (m_attribsMap.insert(id,attribs).value()==attribs); + } + bool unregisterCreator(const IdentifierType &id){ + return SimpleFactory::unregisterCreator(id)&&(m_attribsMap.remove(id)==1); + } + QString attribs(const IdentifierType& id){ + if (m_attribsMap.contains(id)){ + return m_attribsMap.value(id); + } else return ""; + } + const AliasMap& attribsMap(){return m_attribsMap;} +private: + AliasMap m_attribsMap; +}; + +} + +#endif //LRSIMPLEABSTRACTFACTORY_H diff --git a/src/base/lrsingleton.h b/src/base/lrsingleton.h new file mode 100644 index 0000000..f011872 --- /dev/null +++ b/src/base/lrsingleton.h @@ -0,0 +1,59 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSINGLETON_H +#define LRSINGLETON_H + +#include + +namespace LimeReport{ + +template +class Singleton +{ +public: + static T& instance(){ + if (0==inst){ + inst = new T(); + ::atexit( destroy ); + } else {}; + return *inst; + } +private: + static T* inst; +private: + static void destroy() { + delete inst; + } +}; + +template +T* Singleton< T >::inst =0; +} +#endif // LRSINGLETON_H diff --git a/src/databrowser/images/add.png b/src/databrowser/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab335781bf67df5cf70324f15e9c01fb9e3b561 GIT binary patch literal 387 zcmV-}0et?6P)iFc39TfP!wRX=u0sqC#G2Pe8F}$q{mvEjU4>1w=(p3k~(sK*3LrXEr$YDsDnX z8Z^usKhGQ624jpIu{Zc!Kd--Gckc8%&bXgn3vQR&lVIC65{97yR#ip!oE%H|PY3I| zB8hBrPKOJEWm!aGH#w)n1;ISeBC(sC)8R6~y(~*=Sr!2|O_R8;D;7aq*ENHGSP0G~ z;b4(qnkJegiL%2uj${}HjDsK`j^ikJnx<5d&~=^mtoy!4*Gk|WWO<%bXdNWjwv94; z-^Ze+X;2QY6Z7Ch&EyWwQ4}dV6h*;2&%?NFTN1~y@q+*3DIC5BM{c44ukrML`qN{2 hd_0~6N9;?00RX=k_DKzoFRTCn002ovPDHLkV1nDMnmqsj literal 0 HcmV?d00001 diff --git a/src/databrowser/images/check.png b/src/databrowser/images/check.png new file mode 100644 index 0000000000000000000000000000000000000000..3bde53b3bb326bf370839961f1e752436e3d497a GIT binary patch literal 617 zcmV-v0+#)WP)gTf}lSVx-{y>P`n97R5#v47eNrTiy+9G zq6pR?OA7HqqQU|R6r)911X3=g_NUP1j_aKBy#|M1TQo$Os$`p3_*yWphzE3O)wD#(IkKU`U{Ttlcs~@bC z?IE%eRz2*st_ChH^f&<6720S!KOZ;WuG+B_JeI2QG~Zc&35x7jRQS0-1&(s!#(__j zg&9Ufh~EnMn71;atV5Mmra@;Oqf8*6deA1kEX)`nErxPlp6c(IySjAAVvL7+^muJu zsF!Y zMzbu-Bc;@c$W26UuEHfP5C986g>!Cl&P^eNsq1>Vsi|q65fQT4ERxA29~l|pxm=E$ zrm5Jr%^k;K0H7!e2_dB0?Uun{&@l`{CK3r5jYjbcAK&fsvQP)H00000NkvXXu0mjf DawsKv literal 0 HcmV?d00001 diff --git a/src/databrowser/images/check_circle.png b/src/databrowser/images/check_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe467b751046418f22aea200e095c9f25a5228c GIT binary patch literal 933 zcmV;W16urvP)Mb9 z(q@oQv;uKKCkDeRvOppbgJh0bJ}jBZ5)-3K=7*8Z4`xf2`AIa(o^zh(ocBHN%eAz$fa5suJgGUKKB%rD)*jL2b$Rs|tSS-8S+S=NSi;K&X$)vU*iXyyTudBPe`he-%q3jtJTV`Qq$br?6BMI9ml+#m=Ih@=kdtRGeB?9Bf5SGL^!~$WSPRSS-*@+VMds3v+XG=(zbcB60-xV=fdHZn7~gGtkR& z46eiz?PIR7C6EhE%n;&0 zrLF=#->jQynZZ9!=e6F3{05lf1&}g0>~MdoiER&SfK6*+N#;tumKhbg^WqAg-JJs53TjrW(Qf<#C(AqGbYAJBmbgKMHW&_vlN|Z; z#JbGP%-rnkY`fLEb?4Ee-!@iN?JD_SqhVs=@0qTypKnb~J-I{0HKHiWYnonW1_Gfc z3@lQ50X@ZELQP|&|Be6Yqf{e7y7J8G>gpm3iU<*lZv+?s3J;!e|I%#300000NkvXX Hu0mjfdm6m_ literal 0 HcmV?d00001 diff --git a/src/databrowser/images/cursor-small.png b/src/databrowser/images/cursor-small.png new file mode 100644 index 0000000000000000000000000000000000000000..7643a546d56a793b464b28204afb5da71eae8ae4 GIT binary patch literal 397 zcmV;80doF{P)IVpFC}X#yG&0t{qbk_-U)l^MpKIdf)%jEqbu&=5UR3_uCk`Sa)3%F4=y0}at9 zDi(hH_`!_C{^sT7)%ot-yPu4Vj9NgUiv(Tp?b|n2poR}!U0tg=I5@bXqoZxUe*L-w z=(6Ql{Qydd$XH5Bs=>j*VFHj&J$LThU7+S~s;a7aKt6_Aa4JR@5E2qf;pOGk=i}p( z04AzgK(YT878a9OSy_oQ0O~D1AeI3d7Gq#wFolhcEdaWdKcSAT=OOa(W;#FfcP9F*iCeF*-0cAS*C2Fffdk6>0zg00(qQO+^RO z0|gNrH)}3`)&Kwi32;bRa{vGf5&!@T5&_cPe*6Fc00d`2O+f$vv5yPVnx-O6m5QP`41#DlnRxxlBsxfv_}h3~eE#s^xmzjF>*;5s z5xrMxx~8=zAp{jgPI;cAFHAps=I=$JiGLTz3Hknr_V#v@UhnwT_V(+oSxz}G5CrMg z<|eImyEfJ9g0d{5=`H6_8QKKQK zRwGQbkeIMSjbsAjf}$v=FpOzD4osY#x#W2s`ZGE`J;it|D+PqmnZ$4u6*QToh$)gp z*jWe^Oj9FyNZ@U-a9{2qH>hmeHaRK<(zKWYFG;9i$HZcmB{0!C=gsfZj7upD7LG*< z*@D2rb}UPWj-#;h=zK{2u7fh^V$2J$H?3BSeW+FLAj@=9${KBK2%UVGuvFNVnUilamvCi>n2=5|e~IkPvHNqD}3#jg_rpq6WeY+!Nyi3k5*{ z@rmI-9*>Qn5OSFZ=>WgIQ|?-uS`UI5GBWkgiCKh$4Zhg0v$)a&6oGT;lEUQF3<+U@ zwPj4UEX!00_p_Myg2kK7CQ5v@wZsEqD^&xQhz5f(P(|Px&}ihF9dR5VTEj*V3`56ETw80>wQE{D_JW=b?gZW@F-oe~)9aVY&1ed#AO~auF1UXj(xJ%x_Pq$_8zcIAQm8ea}Jn0R}UlMbHMMsdKOtmPxg_Mog^EvLZIY=P^;2$YMX^V>A}jmmXh z+TT9_Qg=^l=f#&VZ$2#*n6-}|2ltMSzCQ)i2RPBUf#)isiNpet42Q$BA3ys0o_G2! j%dG94o%dhqziht%K25>X5q@9X00000NkvXXu0mjf^Z(z3 literal 0 HcmV?d00001 diff --git a/src/databrowser/images/data1.png b/src/databrowser/images/data1.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5baca7001cc183e3213fdd58491e9a748f7ffa GIT binary patch literal 698 zcmV;r0!96aP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00JUOL_t(I%gvL&Z&Fbd$G?w0 z?tKs1_X@}l3;2T{cAyD1MF*psQxg{#n+r`ksEeB&95ilfY~oajNE(|U zv^C*J`Bf0`J-C+_aR3oY>f+*A?#WHgJ)iT*xxhb$@H+`d0&~l&=WjYg@>N+i$A~O0 znyKglfF3g{ykn$0&0eCK?d&99e|wwRJ8X>}xPI@#t&1zpXOct}LaB*T0zxP#Apiiz zIXGuvjDs`wv)g6u!%wxf4^IzYngC#7N!=7o!aM|+ruc*@W|LqN)P;z$31Cp*)FN?7 zwDzYb6HerVpfhscr7vxaZWD<_-fFdao4pE3`aVkf0lxRjV9*8yuwvfqhQ|_s#}b5U zc0tp$Vk{Q(iU6?n=5hS)>iu=stY7figP@dx5CTf+zyV|6oR7|y*644&d-8|i&ZB5v zvQV$r7QiLzJ($>z#Yo7ua@%*!an5=}QpGDoI`J2}M!MTHK322(PV!am geR?lj$A1yO0GUk@!eaH#wg3PC07*qoM6N<$f`D%@C;$Ke literal 0 HcmV?d00001 diff --git a/src/databrowser/images/data_add.png b/src/databrowser/images/data_add.png new file mode 100644 index 0000000000000000000000000000000000000000..4525abcebff9242fa930901ddb0449a74faffc12 GIT binary patch literal 1178 zcmV;L1ZDe)P)WdKcSAT=OOa(W;#FfcP9F*iCeF*-0cAS*C2Fffdk6>0zg00(qQO+^RO z2o4J)6<6?txBvhE32;bRa{vGe@Bjb`@Bu=sG?)MY00d`2O+f$vv5yPcY}cQCu|YsztgJQMXFAuB?cyYf-Y$ zLZHEaz(ql*n<{RCTN9ya!C45B$e2koGw;W|`{uqMx8HLolg?xuq2R{H9PXQU-#y=R zKIh!~i2m=FIR0R3D=0J?+3RU4Ux}jRf)MFk9P61hjmt`@d>qFjj+F{S*$slQ?fb2U z?}vXxk^I&3vLEl=`{-bzK)tTt?sRBXsa{QMO+pCDvXs&^#h96KaL>=POcTE+Wkjyq zp+}FlqI!Mj)`JJPR|Y<iL5+rs#avVg!N3%niz%fv&KOG%1>$=asaC7BySs~La%(eKrB4mG<87KG2M2=Aotpvs7O?mb3t+C< z2kfX+nl(Pj}x6C_iU#|W9k4MGd+@kGv2JU$rdKR5OUjgsufiE-cPoKs< zdQ3-72gWrUI3M65I`%zSUzeAYBwU}LpDufzH2hsR1lOlEn3*|2*EbeMI_K60*NxLJ z)_&?g8`#$*Ml!g1wYa&lpBc_E`hhm7!P|9e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00KTqL_t(I%Z-xDYg0iO#m`)C zW^Qt8Z5|_#+Jy5i-*Pz54vtC3hSnfNsLiY%D^ZE z0B|871PA8=g7aUs8vl`fQJi=@o4pMHQg2L~CKBlZfrM6(t<_$Wh(xsBX!rD=lH}5( zNkvwT_Q}5;ww>4>tKqK1ZZx|ynasMXs=iV^kIl*|HY@M(z5WFpx;X$9Jr)nVwmx`m zL1-2?bY1_PNF;m!AkW>unY=J^Y0}*lAbv*>j4@D3!5A|ca1J3vb1&=PjJbz1%>?oq zeRgH)$rAC|`_S(hK-e8ez!`$m;spSdY6T3Z!)+u^S&m!=FbM$iK0TUjbZ<-+D>+im z6|h`PbtC`*Rz^)su|)!t!OM0AE?EnA( literal 0 HcmV?d00001 diff --git a/src/databrowser/images/data_delete.png b/src/databrowser/images/data_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..338a45611d78f34f9e759c01e314d6300d4d2da2 GIT binary patch literal 1256 zcmVP)WdKcSAT=OOa(W;#FfcP9F*iCeF*-0cAS*C2Fffdk6>0zg00(qQO+^RO z2@DE5Eo(wAa{vGU32;bRa{vGe@Bjb`@Bu=sG?)MY00d`2O+f$vv5yPo&efPe5 zzI(p!+ymV2L+oCdoi+7LCOjSl_Op)T9}yzx^}MJv2)v~0x(Uzogy*@gW!Y8JvsjlSuTg8SFXI5YYDKp7`;&};*#sux}zw95CUNsAP55Tq4f1RuZLj-{?E1@ zluAX+&CNQCi)$Z_jGVt%kEt{Qn5K7eU;y1+T^bSz0pIsgt9fu;kGxBM+b9dNK<@KA z2z+@NT{m>sEq>4#Q)~Qi-6*lP1{j7wJPtajQee;xBMK&HU%;{gRI4`1WmDSLRu1`m zp8OWF*(~kbN=pDCB443x%L-Accw{vSVo_#QqJr6sD0mgbx1@#rb_Ri@O4BqMqa}dn zg*BoV3ZYQOU@%n`bWpv^H-9T~Ur~glg{_$dzX_lz9aW90y6)1=t-D*wP91CqZMH@L z)+U)uvJUZ<8TfwGt|)Qz_6lS&B|6Na+5~7yp;=7Zwq-D;rA7kroI$#}y0E#qNo#g% z0Io#GVGR@lGw7g(R7#_pwb8+dDD;VUN9w>prfCv*Me<)RmnEPO%Dpu3?$E!FZf70I zS~tx)WsvpHffQX80coKy|5j{N`*55e;Lm}S#`mws2l{KHsys6=%UZ zFrZ~sQ7jgsOlIoiJrqr(jNFU8>)NfcDTK$5A^p@T{Cw&dPCrq`jmsb5@$2tWu%x7j zgR(D`N>T^r-m)ypyoTNFZ3lpLqD+%VPoyz=VF<$b6sHfDLbf_w+u+_-v}5`G8#U9T)I)#c@7?n%|j z$uE;l6fFSy@MA~5X{%)Q*z0NF4n2k_M7leM--pg&aOexn&zq7C2H=297uP-;^UvZl z2#wMniWcJP*U$7iubmuB3s94@3S9RA4jwe{@;_HG^X5x9Z~!tG3(Lk;#9-SkMnx>9 zaVHHG#W=qQAaH|+I`?bbQ1H{(8piV-!OS!jt{NcGqoQwP8f|THYTL6dd~<9g*y`x}eEyeP?HF%))YPS$xYro&NL>H>#KCj8-^Rbr7t3V5 SyvqUr0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00R(7L_t(I%Y9N^Xp?6Ye$Jck zd*3fj*RORn(U{Gdwq~qBjJCa4b*$^4Be~WfU7k6p_U1)9quw*r(%GJ4Y-il@C%YVnm)04^TsRAB?_P_hm+dKEQ{$v=U zi3`Dm;NV<9a1H>FNy?Upkea=BZ{X3)cWoMXhu z^maC#cto+*V&`!~bJ>q?KB@4(l5jX}cPaRFeL5D4-FCTL+w)ci%cTV@mlm;Rtw5r< zu>cpEbq}^S__4L24W{l!u~=N{>gw7K0NU8ZH^&FVL&NUI7s$7z4MGTT&LM=@@IXo^ zrRu#z=6ZS(jC~YMqHl$1A;lR$F~!9 zIt|&iV+@hqyU}~-5NL4`@OS{rLhb5R)Vy9?IDI;; z5e4cVEUd<{CNltAhtLI_&PKEi9mVvQU%>ZD5PB{LN+v-b56;d+m9bj!9R{TK@2Wat zIK?m7(rq(;CxdJE{)FHhTnIqbup>VYsJ*Br5^yL5+ceRTvu@eg2p$1IptHSY-#fln zpMTMHz%aFLZfF6Wk=u7PqP-D%jaVW9EffMH!g@Sz*MdQsibQTPAn;^Z>loGb@lbz% z*fBR}W7jU4o|-yOM0!tOUmqEh}2cW^JpZgDys+i!~_^s!HXp zzs{XYE5D!extv|DRwH;8egxhh<^1djpgrPF0s5E_<39lJ0l;c4W^Y8qu3fj6A+UMrB8k7t045D zsQB1Y8Za+;$V2~wq|i$VX$hEUxP<(1fz*3=l41L*UX-oJ>$bkVy^WD-%1xO z*n5V(KCJa!Yi7g$yNPcvtgK}9cH2K)RqAJ2yN86R7Of5QRb`vTm|1JBu-2HOP*H4~&uR^0CsMVmVBFYk!3OFY)Mo<(Ld9Fy3j3mkE z_XiAzL;C$by5Wz_aMd3+POPZD>NkNw7gdl)Gp66(-P)ehy6sF88{a`Y<&E^KmGGMJkYfYZ#D5c1sF&XP$KOwXN1Hk~7znm+pQqCqlIJO-QO0OA!5E8kj!To0 z7_WqD$lyUl_KE*hn2A`Yd{?5P4%V+<%wBAv1T?iPBJX+7vXh|}br`Z3?CrQUS|9Zbi(i!91ZDuwFcBo58Js7Mz2lMmue_CA~K7ZeRbImxGdN(;)AR@n2m>Zib)F_Ho0WFJX5G;^SYPqWk$}LcdRRkLRac!(RL1qW2qLIDh`|U+;Kj z-n6Bq?!#Yxd1ZfD>RsMfKepCx*;XF9_oaP5p?B#7J^e7Rp4jY0!{)L2sCetbg(J(~ z>rTFt{r2TO=J74pl1*~76hb%_Rc`q=N7DZP^snM;iU8m-g_SGl00000NkvXXu0mjf Dq-kv$ literal 0 HcmV?d00001 diff --git a/src/databrowser/images/data_edit1.png b/src/databrowser/images/data_edit1.png new file mode 100644 index 0000000000000000000000000000000000000000..21f64c0f76de86a02725c6f15ac240f6f437910f GIT binary patch literal 884 zcmV-)1B?8LP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00P`eL_t(I%Z-p*NK3LH`c=2fdI1pqL;Fp070Z}0^BFf`?cf7Xj0mn43k zi!Ltr8TWHZVnJQZ6u1$N_!+?;!a(@VUmJ8iQ*o%)V^mbuICRVYe3gL^3nH+NfwIDY zU&r8KTPKprT99GMLrKO(9KO&Hz}1_T)$V?m>h*f5-|wfPP>2eGKqX0{k|a?<5a>i8 zKo3+Mr>DC$^orX`dzPB0<5H>s?99~IOJgmr$#&E5j2m-u5MWghErE_0K%rt*oI=_4 za%f6k!I_$kV~$!>)ZSJH>JuDT?)}a!&M0Sedh#R`88^@SgBS?E0pWS@gkX7D#iNcM zhC>1ptlbZP+J`=pk&G6;QEGX7VVa?9o6 zFWt1&-4r9|;lWO8+-5%Jj|pcvSE|PTR9Kj57YCz#_!N^jv;6>tWKwD9_N(In0000< KMNUMnLSTZomWP!9 literal 0 HcmV?d00001 diff --git a/src/databrowser/images/database_connect.png b/src/databrowser/images/database_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..06289852353230b10d0f69532648b3c63ecd761e GIT binary patch literal 1325 zcmV+|1=9M7P)<$5K$!H zMj^NnTnU2XK#XG&1QkUy3>jZ}$mj%_`jF<`^L$WQKiu+?#lCYr&4yC5cy_fTs_ZCptUX=V}vnUCrKJdQL++-%Z)Hh z&MK9j=yr=^V`ERZ)+LykagVgy9Mn1+a?T-ypeSs}jUFeb-Zi!p{g zw+JDqRH_xN+b^uf^jCjq?aFg=P^}6|CCGD+EQ2(4SS!$4kR&;AoYL(^bh{BtOD&d{ zmswg`VsUYiBuVAE1VT6~B_v5f7#hMbquWi0q8R4{;E3ZGrBc#Vp;X#ekmH=g_kDzL zc3lEvimWI=N{J94C3v2|_r3nS!Sf_iN~9DB(d)HSuxkj`$niWES1Ot?O!`Oi&wJ1V zUE8Y(wAKVcK&4VG_2G5{C)Oyi)?FrLiOrh@jYbC{G+L*GVT9H_Gt)FhYfYZ#WLbvR z8X*LOgM%zAERbbs3Ahh<6?lFPK~az^1xX^Ywu%rwn>P6b!2nt2Fvg;kB93FyG$o26 z!Z76AxgYrEn-93|x;qHN5a2c7dEkg#>w#%H2R+q}qR5FNO{*0VMLp0YNl;3ml)@Op z?Cdm?lOM8w|3m!z^XJUX9WVF6Klz8rzE7oA)3n)_7=N#>J$gjWtMyK;5S6p#3BO_NcFc2W6WOVd~>bgNI3Ts;}!S&bI z34$DJyR59N&}=q2a^!v9dFN&BzIzu%A&_zdolZg+{=}9o_b@O}>t{p#>#t&72v}Ju zP^wI|D%rYqBWXIyE3Z7po;|ynpI<`C5!GUwc5>W+g1nYtgE12ufIMs zvmEutA~B|5aWSURSYrSF=a`uIgyG>~f?y*fBg0Hh9cOa#YbGbZLa8=Eu%(c)`qH`z zcI~QuJ3Z}gpPA{tDP?-6ltPqB8z_}F;CVfhCngTDXU~HiK0L+)4?M-_=nc%yo@HU7 zb;`NQGgDKq9{JZN^J0DUQS-(N7tZa?GIiVJby?dWj#uza%@pgH~j)#9A z7})ad^77&dYrUh>(+7|L*LVAIAOxNOhJZS7C2%=V0|tN!Q0h;_TQ|w;l<5cO7?1$(61a`l7V|?b100000NkvXXu0mjf$X<1k literal 0 HcmV?d00001 diff --git a/src/databrowser/images/database_connected.png b/src/databrowser/images/database_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..a9afa58d63fa903cfd4fb6f1840b2d4cb425b488 GIT binary patch literal 1487 zcmV;=1u*)FP)7nX|;R*&&<8k zhgBWRMUdAH{9tC7Ip54VXXe2FdlUCgT)pZwFD<1thERsNYjKQNl4R_ zB>AkLrU_|kvDOlX5w+SHAAWc>Di#-?pPYQ*)PHTty8)i3PYn&x)!FIL)Fd#*5XTy& zG;yp@sv)g4S|=D|&{~ru1|bB^%`MGJtvz?QP3P``QnqPv5n5UVxf~=(hB$^Wv=}2$ zN)QAIz8_Mrd(`V5mC6dMtE*Hh70Tr@K@iGK0YX?KB?Li=>uOv#rd|*5JRfTXVDWvQ zC<+O~h$srzZ;)WE#c>>jux3+$)@hukAf-eIkP{SBFnL`sR20wEgO=moPm zAd|6vbF*S)MXiTN-pKp_5DKM2T-QS>jn)z6@=d_w$dLgC2Or0*AJ}mm-g)Pry!6uRt;dfaKWwdiZ+v__ z-f+Lmm%ZWx541fL1PPuO5d@kfQ7B~y0>!7F&eG9g866$sV(BfW{TV(8X8{;&*~d`Z z0giT#FgbbYj~6an__MY4&3j^?OV;vG!>yJyP4GO0>jsocbF{Z796o%2?_K*bwY*PZ zM}b}0`vEAaHC|ac$3*chel`5UNn?zdn3!-krj$eTmMw}X(tt#W3{qy$Iza0xBO?cR z_T%S>3x;jmwh;sYwOWl@twtDzy#3f1en-p?=6}NQ@bHPAo}RDDjWH08QaQG7PZ6R{ z5Ug_hc9~*vhW-1yIkzyuTB{2}P^nb#JnxQvw(Ca#Og{1_%DE~RZ(rirv18xd0I)Vm zi~-+o#@a1(b#?LZ!@KG2ZKtoVm#O*(w6wNTsZs%ho%O;g?*d4r{uC2p2(vP<;v zm2C%c9ETTgyuyW*OSrMiOgKvzMjQVkDdpDAPD{1AiZKa7NF1k;|4EXN7{kflrw3%R)f4ni54# zw6wIdXHPf%{d<|4`!|oY4U)!+BXi%tahyAP@{@1Fb|BwSCV;`#0p{mFxwZjNC=`BC zEUtQv({PQ}Ddn<{5L=m=n&aqwN9hT6kj)7mz4kbcn!rT)#d|HtR7udWfh0@g0gS*Fj`qAk)}bOW=m4 zFMN>Seen!qV`sh^E(36=dzeEzhWYyaPw?`~XU>g{o&AeaYFvEI+AV?RrlzLt`Fwt)zklCj z&ph+PV+Rj@dC%R8rl#JVJAL|>fBopA*}r?9_qRBXS3fTx19SidAfL@Q^Bc<#D pwyv+Kr)gR?#>{E0*8m@={0A{n`%(ugu9yG-002ovPDHLkV1ibd$ua-{ literal 0 HcmV?d00001 diff --git a/src/databrowser/images/database_connected2.png b/src/databrowser/images/database_connected2.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e10222c39a6fd61dccf9996e19e1078ffc62d9 GIT binary patch literal 1378 zcmV-o1)chdP)Of#;6jSL>!GnxB7&o0KL8Ni5b zuXLn)ua3U&{QrN>`QiWl5uf}qKOdKum)&7&vwQR0j0s^!wDv>R>WWgTq_q}WE0v~M z631yHiq@B-C|$_&?9Eooou8U|Vr^4Fwd%jyZ1P*Biec|PLI|9*SZi_4VeS9kowGRS z@!peVIX7-JdH3DFn&!p8hXW-Yke?{q(_u3~${UQYs0IF%*SHDNRu*lxh#H zHCkJYF=(x^)*ytST<$3=)%?lL%<$$9rF>~=33_@2-Q8eqKv6)Jd5jS#B}h|Cl4P`6 zF|Ah2>gpQn>+7tpu2QepNz+VjDiFdODIrZAQKX5Yf>tXfjuX5WfG0^3@;oEUa`HUe zh`{2#Ck#V`@Mcqi)~;|4q?8B&QbG_2!Z6s#Hw1x1N{N&LA=;xe3ubdc5cs5AR;;b5 zjq=Ek_kolW?>$mVjLC`P4@r^+MUhby3C2WJD&1sRcWG0BG5!`QyBQe~EHB?c2!&D^ zQ52(;M(dn<{W=hH`0(BA-+uzLvEVQaxp?s{o`3#Ny(dqe{HFK*Z`0G$MMr!WF2vPc zyKcE7O)YVplcpML6-pV>RPp}%R~Q)Z96x@LhtE93{CjWVHUu&Zxoh76o_q8;W@pd; z;q2M7FM03(@`)Pg74NyDomP)?mN-^KQOe3njsAYip7B8rJTk#;#|Ak1;34+*j+5Gi zH=7svVCFr(^61^X^y624aKE`JWq>(w7vmj#>BIn~p)S7n%kOaE^y{ZCU%p(Goiz}lQr!#=I)rGE zrt5t4QJre_A52W_;D^sV%x%YR{TLqGh}6ZTd5VcFYSmEQ)P?h2i00?zv|-BP0Fn-8({cVV;SjW1k5(u|r1|n^}5qFY&L1d3NmBKG7j4 z3cb=k2kk=@$BMJUgN`?hZNG#cv|V-Z3U zhVA`tttBW+Qk#4(yuG6!C`+uhodV~KSz8nA-aSO6Vlk#gqtPJC3W6Xc=m~fy`TOU> z0aU{h^aKbIeCn$BPzY!=9C==%r$;h6+D9DkqgMNXJv;AY<&8!9#(Ot~1L(*yy7NvJ z7XJOujtGW^hMuZc*W)m3r$%c>y`CUMA9Hgxo|=4yRxKr6EU>xzZ1@d}PBp(c_G?~! z_2rj8)zL0p@?TzAY5hjZ>|0U_VT>n=60TjlL|0eL{`+?G`0NApZYv{80@>9@*urBH zOVLpL>iCPicK*WD%*^z&VzXX4GqbX9aq;@Miz5H3b9PUf#@lMOx&H0jw{)L6_5JY4 z^AB-7zKYloczvqP)o_%F%>cu}QrKZIf?A;P5mrA9FVkl2*YqxN;wSlZOmyo k=jz6on%24rB*5x_0LudzwbaOl$^ZZW07*qoM6N<$f?7_YD*ylh literal 0 HcmV?d00001 diff --git a/src/databrowser/images/database_connected3.png b/src/databrowser/images/database_connected3.png new file mode 100644 index 0000000000000000000000000000000000000000..af832d4746f7c2879ac3e86dacc0befe0a12bea7 GIT binary patch literal 890 zcmV-=1BLvFP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00QDkL_t(I%cYY|Xk2v^#ee_z z=Dq)XwDTroXOd=GYcowsNn?ygrM8F?5gIKb3dKzq1()5rawUj65h@fBMcrA8MKOv} zk@`_%P3)q!Y9?`Fo3=A=K9ZTqyf^Q2T#QCE(2ZwxxNz<{_i``%Pl&(C@aWLiiRoRB zW%k4#h#A_X9*gYNWF!mVIlk%I{%>}}o2x9^7cb2$e_6O%Y;H6-bo{O(yYI`q7mdoK zE~O%+j;>3jt^?q>F0Sj~I4-W^gq@DlD*jYG_U&86j}?Hy{l+Pwh!g^4Q$DdNvmz8> z42~vG0X;#cJ$f=4Npv?)CjP^FkZP=(wf4WhQJtHcTS+7mxrS#_vX&@Wzq96*acK7h zBuHuf48(^Ri03i1EbVst=H%pLE&_1++?yw#n|}V4?3SHkM>>y`5?$AkQc|neSXfw~ zS~qd(A=P*bCmD2SE}Z@+!O>U8SE6y5%k>R0(m%m)cATAe?4fk6#+h^PbFuF{gT{6` zp-ri5GS<2m)BU-6_T~AE3h>CGDNQk)DJy7*vb9WMb)MP67yS7BRThrSa$w&9R?{Zd zwlze~XQ{SGzJ0&1I{Lf++CkGdx%Jl$N=s{e<$cG)k3Yns{R=I>iPf}lYXLzg#FD3XmES+P?hQRC>#RxHG+%vF!(`U29X>dV_kZOv`UzHErB_fY%HNy%5{7+2xI_ zL;(KKXHUF#;gZ+Z2= zOnz9gR*c3Clgrifgsl`6Ow>+*TkAP@!*JsyqCpb3*whg4diO1vD zHL1BCb}Ze>C$9TN5xOB=zvnCzfwvYgp&l%M_Ri-g#O*#Uo6S7&%!^OIeI@ck))Gy+ zK+I2aw|LMz^U~SlrdgS}T>}jm1V)~G_Ni$jW9$ZKR2#)lKKSTUpa9(b6F1FCf4{V_ Q_W%F@07*qoM6N<$f>Oew5C8xG literal 0 HcmV?d00001 diff --git a/src/databrowser/images/database_disconnect.png b/src/databrowser/images/database_disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..20ff20050a2f03f64b91e32944becd475b01330f GIT binary patch literal 1341 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 WhFeU28_*sA0000B}jJ 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 b009O7a1`vpDeMe#00000NkvXXu0mjf4S&pR literal 0 HcmV?d00001 diff --git a/src/databrowser/images/note_edit.png b/src/databrowser/images/note_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..c199961093dd2612df51165ebefe104486db4548 GIT binary patch literal 1511 zcmVWdKcSATu!_L}hv)GB7YRATc;PGB`RhFd!>1F)%Rxh&T)Y000McNliru z(*p(<0RyAXG$Q~2010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00lou zL_t(|+RasKY?Do{gA{ZSiYVd+0m?%Gx@Jpjae`rAB z9|b4zmVn`AfCxWeDluUy8H2enbf6oIj+N2d*7aL&YrC#rzg~~0%@`vyhJ-(y}+Hb}9U#L)x>O+1e#Cz03Y6=}pG zZuEUh`LerM^|>dNetTkk%A_Fa4_*iU$b8Gp5&IG15)o=Sf@UPql%(KA;yR(WMl91; zK{l@%619;sRY*mL5k3FjG3>1$O6e7!rgMahb!Z%ey;eRqmU?m{a4CBN-)U?TB(a>2 zqnS(P*7;O55@|s-6ox8Dv^A6=p-9d0M?f(Fp|l!t^|}_tP}mM9AYu*z2Q$9whk~7)Ahv zPLIN>I!N;M*kd__#?V`+Pd6j}?k<>jeF*0A5hN$VNj0!}#sD>F0dZCH(KyBiO$hq~ zNW~Kn2y>8^uR~EyJ@Rw~kSYurcGiJI>`4f9O1LW9vG*8@N2*&eT)PU_pC(v*<v_t~CHi|1#Tij7n--vF^pGc72bj(cV%I5XZ3D|{$Y8E7cdV4uH${l_jt z>nKNDgf=R^`>r$3igY+f z!l)>(KrRiR-#-PG4Z&{pB4zjD)Dwx1pK0lc&QAN8I+*$u4*8n%C2mU(oTh#n4H|!q z9x6i#1r41T(@@PM$(1?RX$?T1l+WkMn-%X zFxjy0wLMsAe1UQ~NR9guiOF{p2O8#_fGI;q>e|@}G`4Coh32sg!0)nw3r)~nC2VpQ zO%;nU5s1L)^y9k8j_s?r;W14qtbM;wem~|_twQPYUP<&qZ5z3XWlR+Uf>{P)8U;?o z{T)c91aMo;$kP_1X5~7Flnq$zZNLw|cfjWKz%=B*+WAdrWZf`zo}g9jquI9(rS&h; zm@I;5@qx-o2TsmucEo~3VRzX;-tzO*a45UYadCXxdK3$kDzup{f~)qzsL#Wjh8574 zFM+PSnWp)|?Dwg_36Rk*h=}y}()RToQ-h;-wQHsVgQUxTCLQ^Etw3Ir?L%R&9cG&g zmgE4|G!&ra*$vQ_E`dy0OZR1zatkrbR@%@G`o#(yhYp9CVqBY(rZcCwiHEsB@fF#! ztHP;3KZd$a!QvItEGN)2#?A8RF{i}Mov zCA8DMmq;?(L+)=7JC^YmC6VYk*hn9C5-;Z8x9A)rJt!pPPBA`^<6nwwKt{y$u$ce= N002ovPDHLkV1lR#r+WYZ literal 0 HcmV?d00001 diff --git a/src/databrowser/images/plug-connect.png b/src/databrowser/images/plug-connect.png new file mode 100644 index 0000000000000000000000000000000000000000..7af930e58c0f6dee83e7da3eff1f0cee0b94092e GIT binary patch literal 1370 zcmaJ>eQXnD94^DmWn`lcG6WYmZ#apry|4A_Sb_UkT{AjIH`yW>x%J+)=X&>+yDRM$ zNp)K?oMB|B7{(T}f>CE&K*=y5PGU%gV8X}#5JWJF%8ZFaQBh3hU0KKeFuUaL{d%6~ z_xau{b+u0w`6Ihuq~F#^~snJY6Uvd48oG)MSndph9Z*a zMH?LfJP_kRM5=CAL4A8|L#VwqyXMMZ3xIf7m%bJRWv&3MKijzF*mm{6v;sJ zRxf(bsir_3!a)@v4m)lO;Z7WJ5_W>BaJgLN2#FIohLadU+6Wg-ku;7YGY@K5Q^giK z$opn&87nUu(e)UOVTnY-o}lbd4P%7I<1sZz(qdTW)*m#g;Xh~OHe^f zMWGqSbuVgodM^Yy7L>vfU7HnGw3%cXX~U923?u9~re-i^d|6f?Fh4_6bo+UxA$eusB2$yYEVX=lY~S*l z8ouYN#||IjMpCD&T{iuL)o;s-(DAy|hSboO>9kT5&+j_a`A$#XL-19k`~tISvtMgp z5*pt->Yh3R!`B~axmNhu4UT>KwPKhKkM8=RW7(f2y|&%9+x=(6yq)CO=~1Ezo~wG| zjr^O(3x|hun+jajH+)N5FGokkhjWiUYl|HF`uwE+k~OCT*Ge$;JZIYtZ%{HpEjO5{o_i0a_h-! z4+P$4+~vb;9GLb_b-&nSI^WB|=QRmu<6}esP#b=J(S@YW`Q{hY9 z2i|?}=UX3+q_%y&E>%`ixHeYO{pG^(pWx)Gsq}$O;XOmc=>e<%O6jdTk9xIu^)F+K zKI(ko_4GhdG2C)e-hR7x$9^U%l?;{9oc-vo;`5d1!S64W_cNCwU%a^F#Lbd#4q_7_ k&0BvJTz~K%{bjfy*RnO(IdS>0de;2g`KxOA5q4Y0e-?4%7XSbN literal 0 HcmV?d00001 diff --git a/src/databrowser/images/plug-disconnect-slash.png b/src/databrowser/images/plug-disconnect-slash.png new file mode 100644 index 0000000000000000000000000000000000000000..60109826f3774207405dbb12f324ed048724c4bc GIT binary patch literal 1520 zcmaJ>eNYr-96m)v4JW0>Q8QfkP>SGo_x3(_IC1axjyrToPRi5BVYywn1^4#cUA*HY zOLHV8OoK*Atr-)IX*AL?VGw0X7${9s5k*BOHF3h!P%|-X7XkUBac6elujhGwpYN`l zpPo8?+|+R@m1?}pNx0>4g7S_TEq|x?JfY-aie&dl3;0|qNC}Jzr}-QPaB)-~<7Ozj zXjvs>WJHo!*Wl3!F0DiDn571)5p@_s;3 zq;mK|$pXrrJ`I5jxY<0PBo2xD#ernWX@f#k075h{B=lpH_y$=d`FsY)4WUKJ%{+7d zfAz)8q5uQA8Idm(ymA$D)x%6Z-;e?vhyf!hp@5OA=%AL0O#cB%Vg&CkYHWH`-hfN4VIIMbTtq=AUJL{+4QIxCQN#(-im?)M0!}r{Y0CYKy_w=L5HI@fGZ{W7>EH=!~e>VA1KbblDXoNhtB9o1W^yHu)?ueu04Gt^P>Dd~F& zpS<>R+^xMcadm9w$#*t&BkmU3pgd!xIitZes$f^NJ5yuSnZC}lJFfR0!{ zBT8L0;zS*>bFn2fAv*R{qv5;!m`i1U^j4Zj9U!8<*nXb>eZ`Hf!R8O26qK~6-N2>% z$0w4ACCyitrH1V-muB6Bi>hiTmNq>iPZM!5H*Xv%smb;iZ4>&!o}e(|0MrQwDR zj;}_%+rBBSsx#a%=4GMo;^Az#wkk_wTa)RqgJ_vzcFl(zIaliq8&(bF5Tsxh~^ zv1tcdd2B^9wDDLtwtL3rwujY;>9fis&!1m*)FyrX@Jmhk{%h-FST5fAD;%BiS|8V5 z<`#UNDeXT)d;+lf?+}#fQl|VdD?C{@m$wcJ@}Z zCD&#|<+j|LT2p2{ICEC&mTg<>-w)Dp`+n55pKPn@*_8bF+;7Ks?%CEm;?NwiebL*n z`h+LpP7JrQ4{yEw_gta+`qZZS?vXWAWN1m`FFk!}-!$qs>^^cTY9jSk?U{R#?XC8| uK0Y_jyo!w1f3DvZ5p|}+p7O>&uQ#gTMTdwi-#oSQ4|dtpiM`hB)&BvB^ggHn literal 0 HcmV?d00001 diff --git a/src/databrowser/images/plug-disconnect.png b/src/databrowser/images/plug-disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..ce71853fb594a8dcd42497a51e1aa89169b41031 GIT binary patch literal 1416 zcmaJ>drZ`J950|7BCml%K^JOa7;WtA^7#!SC~YVzb2U`EOl~B1Bb*bW6agQQIXL92@k><5j7;lN%3R$>5qKIRSDTTi zPC4x*uvHKNtkYoGE=-TXdR&8(T7$vx3QS-)hGGPY6WO?dA_)q^;F$+etch+9#5A1e|5nMqZ@XI#Fj3`iz zn|D*Rp1@58E32n5BaSnyMMp9;OA`!ElbD{RXSp`NBy)ZjnC0@%xOoe5DXR!LSrE$v zp=P!jO1y$BNM0cTTT4l}ocFthI!UdQ;+5(r5czk2n-v8gJe@L%pJzQ7R83oPmdG=b zB%!4l7RPDYVzlZ=6UG>I7M+DeW{B>2Ax{&nCWh3S^m;8#S{Vk%EtrwESS(hS#SH|m z(<7+j2CDYQyndP8Qkqbm&UL@Cn7co~ucTX4ZbxS-UjRW7pV=6?EOdSU(B(~$^s?uF ztL$VGU&xEz9z*3X^JKoXp}#7(B!S)G@HQl`o=6OiJG&k)J-RbAFn(vSCGkKoe5X0d z3pYgTXi*4t#aS`J~=CMy!Y>HZC2}G#yGAD=@|{ ziX7^%*n9r1DQ(+uhhuH#nI%n@(PHfHCcEHv(v^g{B?3VSJ16fJCx1IVS z$GNUOyyp0|iBE^C)~2}NCS-AMcVB+c zKNc`vJaTEp)aqc%gZrAklvUx($-ans+rH4QN5#eVhyOM<5{rA{+fP`wT>6o{?m0zv zN$qQFefz@27r3sh_w==?nO`)z$8Wt{%pR*Xet7l>UAW5>{&J#tNhrDe=GT*>T5VeF z_Pd?p!`9osERPL0cR<$;ue-VO*DF8&-g;YHT(kfF){c_F zetYW=qNRUuRaw9`%FMIrVjPCpD;X--Q nhCqDW(NXO%v1@_D)uY$1w=qa5GMmRM)eB1S^3DU=$KdJe=d#Wz Gp$P!<{y1y^ literal 0 HcmV?d00001 diff --git a/src/databrowser/images/remove.png b/src/databrowser/images/remove.png new file mode 100644 index 0000000000000000000000000000000000000000..afbb0ee753bbbfdc26d55481286052f630dff843 GIT binary patch literal 1315 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 literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_add.png b/src/databrowser/images/table_add.png new file mode 100644 index 0000000000000000000000000000000000000000..c10db3eb254f6b126c912c8a779b23c5882471a8 GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)i;xHd`-}BVT|gnp64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aRvrPW=|K#5R21GgZJ_=I!es(*Lx)RPOH_$c~Md4B(bG23#U|Y zEnPk#W6BhbK(7v`BB{=pfF14+T*3<9yq$Nnb!Ayv`TqGg^H*Lpl&o{uzEgqW0)xYO z)gNuU?Yv`_?tE<=fBb{`KfVR6-a#MBr5F}mG@RMdc{e?=#q?r@uFQwF*WQzMB{TLN zt(2_X+4?d~Va6iQKb*TCsh{n8akV*U*)fnPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipM> z5-cP4shuhS00mY_L_t(Y$CZ`aZ(LUu#(!&{ea_688GB}&#FyALZsI_zrYWLn3xe{% zBNG2Zr9L3k00M+~0U<%3kwEmNLh5s$KmjB~g~UY_kWvv!QrtKpR)p(GJh45ObIzR0 z-irrc8W*7|TRK}upT506t+l?jw*2byA7pKF{WG(3^FNH^_zOl1imD(eDn(IjY;WKD z&Twn{=imG8w@Myz*|*l-zWCVV=igjeUZK-&s|f;BRX{*hlQdar#_{XhQeFaHc~}9n zwbff#T$ty~%E$6FOJz71$Z#;w(Qu&S@knO69sk6+v)s8qJa=$L0P_)Fa1=qS)zJ5Q zJ*Hc&;M7c4qbL$%1n-rqsu+(`>D|7;?(9=vd+xRMOHFawkW4B9a*YragVHb=W8VaU znsH{U-y2?i_xAJF+As)=q2J%t!61=1ZZOqqNnR9;lZ49Uawm!O#gFgEPtLCg-q<-CnQ1-5cclFuKY_QNq8f9QO??%`q}8uWZIBDZR#(Q7x>21t1_OT?MI(>6aSK> zNU*)T+vVz+Gy2HV61}_k$R{afS%7*3&$*RFNHgkcr`_q4%gak)EsC%<6z3gfQ8F4QvUY8amH8!B zKiL)I;o5t5>9m`&aH>UBL0NgZzP`yb7v>mcUYh3;R`^D< zWu{tFnin~v@kokdqJk$fNL^3^SW$`aS{J1hFGjouqSQc2oJJTF*>};6>(_40ojUb9 zIdk^;dc7G<@(D>Y!aGNrr3^+RG9S>1yWG1w#)#s|iZq?DeIK0nc&8Zk^mj%ilagV5 z3L^rln9INZopaw)nh=P601Rx6G0jIJL%n1QIIc#ZbNGBy5@9&}_qRK&-DrH&m_uG9+ z=Owa+VUm#-h3pPfoY!NVtZ?$=={7-Nz$-_3-YZdHSn4*YR29I8NL6`Fvz*hNSc=MP zJq*YvrA)=4o|uktUXO7mrPFpR!tXZ-)*T3xPN_u!C))L6)6jX()=t7gw|Rv12Pr3~ z8_abZ|Ci(ZehRD{rt6^U4@}IXe`7v`iy-n5oWs-~;Q3GQc(Ah1$8f0RS7%HqNddxfH^7!f)%(`X<^ z*oQgYnhBi(#;Ls}vLD3SpMLbIm(%Z;PMv}~ES3R6YsgEt?*vsM8{k!`+Hq)$ literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_delete.png b/src/databrowser/images/table_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..e2655d9f95aa675b401bd3801853acd416fbfb0e GIT binary patch literal 904 zcmV;319$w1P)WdKcYATc!{L3L*!GB7YTATc;PGB!FfF(4~2F)%PM0r-pn000McNliru z(+La>0s&G{*slNp010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00Q7i zL_t(|+SOHENEA^NJ~Okku7%JKE7b-I2KwNOFG-kSun>g%B(%|6^wvuR84(gi=t~b9 ztgsRIBKfepCK6PZ(L$&dlo|wy1!3(j>7usl>YB52=XCF^v-2xizSM=oJ#*&X@4M%m z@6G`H?}O8vXf&FpQ;ni1fQYIQLMpy7ZhSVcXS2Ge(B0jA*u+E$^0F)=1vObL7PG}9 ziD0ovu)jZsxg5d8MS}D51Tz_eb8|9wb#>)6T$kps6L1^{JkOg`w8ZE#5QMVN^W}H! znZ=p$d^saWf^F55)90vE-H^oj+ZkWCP_4V~8a1B_?z(}I|4jG(iY4J>->3}cSu9^t)moCEB zdv_}!tdSal)pQaEg5}deccb?k6rK)1G5Ju9J#KD>wz>t#^mJ}2&1_qdILZ_}yO36h zYYg~c><1|AHCOj*gY0+GnLonYm7yR6JC2)ObZytN(x zu>`N4q`{Yb3+wB4^=Kz{DwVAVv$Q~Ky%CXrHUwf74P<`;NG0%jMVP&H14NOXOgo|O zn{Tjgb^^C>zbQMx2ZDzH3MDB1D6*D<-(L;w*->~IXa%=h2evlZnuU#kNaVo&y|h}A z1QXBGFrME7AEuY-ho3-ItpEqp@7OJXQb{ox`|hxr)!k^U(WV|$i-O2X^5#VriXG?W z-Jy`2>g#inWZbp1MvvEel6-s=U!RWpJ5p0MmJ0YU eZ|i&UFO6T#qM_KglcU4{00000)+jEP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00HAkL_t(I%cYacYZGA<#eZKO zjgMlfDW#~jC4nZTf=V&Lg0CVWAi8QrMBD_$g%m3O0saZP5scVJs?a7IV-ch#0ikHI zaZz=YfHC7H%qF-<7s(`(uZxx;#*7PlR`;F@hkNcrM4|!7f8g2ej{?8}(06=~Scj-HRyVnZ zVQ}JUfqA%PTF5AgrlB~Z}I-p8T9*kcV(LND?kXe%hQB|=O`ce{Unx7Zwri% zOqv22CBgW}Bp(XPbo+dWVv+OLZjyhn1X6PLLI|lA=}k@MY!GA zi$#21FTQ~R9IA>qbeQ+aq*|-juZl=CAg_Ez=)p}tetayi7%5O1_Bwg!Zc1R$Ts@Ob!?N+pF=2XioWY;^Qt zr`s*oR#tvG!QTMUfZXYDc(7b5$uH~ccm8?j^Dwp4(Xsq|=UxC7z!`VBUeCc@fGyf{ V<@d@MCz=2N002ovPDHLkV1h>g5}W`4 literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_edit.png b/src/databrowser/images/table_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..1d348b16594cf81b9a811eb9edd95e79a9b5c699 GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)i;xI|@k!}#_CO)Y64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aRvs)Mo$;V5R22vKJ!w)&2Qu}Fn=qe%nStFK-}D7#~$p+Z4UQ00`df-X-PAY_&h-oeEprc3~c|CNG|UtCsStyc)}6zO3W5kwHvF%XRMk zb^m|8zb5!4K1cKL|1+1h{`=R>`gMPi+u!<#-6!i82~DbAEq++9v6N@lA0wWVR+T(E z@7D5IpYk*Oz@@y!@X;xs`TPDRY?!nu;l{D@&V^@GrY+2I5^i4Bpu?;#FYJ|eh_fZB zrR)7Yi$C>Oe_Gbx2$sk*mgxAD6x@D$3d=O(NoS0t?Q83Hety06zPRMNKR-KtB^iE{ W{;}I^H&quHV+@|IelF{r5}E*0>fT-e literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_error.png b/src/databrowser/images/table_error.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf89090816c8fcb9ab26479c808f89e35bb88db GIT binary patch literal 725 zcmV;`0xJE9P)yiKf0%A!- zK~zY`)mFbx+dvfl?hI8U6((93n3w>m-P(!2psK`xU|~$Rj-+B>VPIxpaAzcj#32$0 zF?8cEfVD%Rh%~Ax84?wl3g5f0gK=WV4nK-isZV;k=V$wU_r3ehXW)M~6$h^Ceg`mQ ztp!Ptgot$FWIlPFex4u&B!8`~t&OLUT-R+IV<;jiFPF=i-1W6E2!xxPWwu(vW>e_< z!bU@QdTO|`veJ(04#WXTD5apaPE+j3k$~ewvDVQ&$BFVJpmoG37vNq!Ro$_lCu`}4 z0^|Yp+M@xIMekzJX_1JaTCGCmOv&@SOwQV9tkpbN3y8$d{K>AbueU{ny;iAIGC6BW zW5}(o3NJ6oR*P&lN#7^ybz!OWvHj>Zh#AD{NxuH5H6Wwn$uaBp?_?Smuoeiv9%Fj9 zhTzi%aB&WdjDoLcfQ91i`+)2xy~ss?-~0OrmX|PY!tMh4wc76C9a3VjC!Z2`X^S%7%E_X98n;F}pJs5@J9FcM?|!jK3&dgTCvOiApE)_3(FJ9P zdwVZZ01verotGK~QyjZ;;6D`{JP)u~AD$XJIr;L>{wn?eFbF$zLv`gZ00000NkvXX Hu0mjf81_O= literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_error1.png b/src/databrowser/images/table_error1.png new file mode 100644 index 0000000000000000000000000000000000000000..39769284f25dc8f19fb47700a9f196ab955a011e GIT binary patch literal 497 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00CJ^L_t(I%cYaOFGFD%#edKB zRvMT1s6>|<8AO@TwSR)78&ktyWRi4f(m_~^B$y<^MtnphVpEi;+qBYqugB0{(P~Td zncj2WJSXotIWKfM0+3#x)Bh}IR!_tPAUYHNy2zitH{e!W{`4IHt6K|Q3z+67wZrW= zf)KyY{`sahPcs(;Z(0fZxIanHM~lVU*|vXLIJnsQ7K~}Y=G9^F?1t;iHsUMgi5Rx; z{>{Qip`g{ZHNBsmR3{QqXJ|-E)6=@KIIeHTjG9gftLNb#ALHh7^k3Z8TBizESIj^4 zA|lHzEd;oyRAy{tPL&wKa;7G~K1v%U!v00000NkvXXu0mjfcXH5P literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_good.png b/src/databrowser/images/table_good.png new file mode 100644 index 0000000000000000000000000000000000000000..3883f4649ba9c3e644cff743247e876057382a41 GIT binary patch literal 713 zcmV;)0yh1LP)x zK~zY`)mF_;6HyfY<_^YT5@3ODzyxEIL|=mkU_msoPv9Qd&`qN(x{)2-lMv_+EO-DD zd<9@t7dAnX##C*!PDXmq{aj3^^IK3zOgzcSJ#%K}eD^y)a|ig}#R`o|rSb{DlraV* zK@uV|vg7{vb@F+F6p;L}xw-iufmEqfdRl9WNJ6XCYQ}eYDfB$y&Q6uxuCUV)w%fvs z3t_9JSu7TNVcdz(APLK|pp;5dO!-K_wgX$K;GS&(~kb)3dyslNrt z14_%S0pdZgV=zjQh@jDEz{=TDyYQNX{VJSE2LRyz^zr)f_ILoTgDH&I#G9<>#<% zH5wQII5?z=jAepe{a$NB;fabs2O*BI|J~$es&H917a{R3Dr95d-G&_ zRM1S35%}DDZXwY{rBbP745o%h-tagiNRxYg_VmncJ!(054CX$}eLsG6Jd*&pi7dWb veCd7h_MDmFpndb<-ggVlrRM%W`>Xg3S#~dm#V@!+00000NkvXXu0mjfPsBl{ literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_good1.png b/src/databrowser/images/table_good1.png new file mode 100644 index 0000000000000000000000000000000000000000..d175d3327709938d6939512604d51ac485924f54 GIT binary patch literal 489 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B`+L_t(I%cYaOP6AOBgulaH z6d};ZdAjasY@-Yhh{uGkDTCJdPs_ zv3Ckj=Q=opTo}9=CFs*0;sOnDyaoVKD>iK5s&dg2jOoK|ZBh4a&K{3J0}@sWu?7UT z*LUa@3vshur~F>vp<2Y1CV~1am^AUE#o=8hWhN!;t4H;#!hP+MPrrtUq6oFt3v-JW zitdfH5MobVs_hcC`wVEOxC)38nFUeFPPE{74Q_0QSG!CQxSj5c5NNmgD$$8Widr#N z<7>>%q)`M_MKwSG^#IZQub)XQh$kb&mJF8ZUf?UO51+)cS&_fg_2@Q}1a=YGS2U`S f7bSPHb^Z1Y0+Gb81W{!N00000NkvXXu0mjf22jG; literal 0 HcmV?d00001 diff --git a/src/databrowser/images/table_view.png b/src/databrowser/images/table_view.png new file mode 100644 index 0000000000000000000000000000000000000000..592de5d07590050d02382698bcdbbf656ed6daba GIT binary patch literal 1102 zcmV-U1hM;xP)WdKcYATc!{L3L*!GB7YTATc;PGB!FfF(4~2F)%PM0r-pn000McNliru z(+Cy^4if?n{dNEV010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00X8; zL_t(|+SOHGNK{!E|J|$iI%7=})3h$L@c{$(njoRQA&rSk?x_b32Bm$T=41<%= zS<=wZFy~Cu7*8Y^udi?5Q&Wsbql~|P&G^_Dr^mpd08BA3gBTP>~F z|K|~GS-lEAW}?v0uw>aX_;(-0qrM@G3=bjKuSMk`9PYw~U4K|q71E*dhfdAKOlq>k zd-zHZ;@{SPAW~(QD(B|H0s8v-k>^>CXo6uNZeSvzBcXF>I)i2~FsTrev6#hxaAyEM z(+6V8Ej>mD6LFB|n$=h-igB7GrI|=lQoWM6AZNYLfXo9Rk|eq^H=aJvQcO(6;Zg|I z)FG~>(;RVwL!ok_{)e~FZB@`088kLFSzg)<{C-i2JMg5V8Lr?#NSXnY;+vv8sN{v> zE`-*9AIY?i@YBZ_i9|6u`OX>nX`3;?Sn^AG}1fr%NmoEM9%s|kzb6^AX^bFwe;c|3`JMmx3RYYTP`X6K*TjcjrCJ;5F0lINk^wMPE1ww zKI_80JAb2e_%?nh3j#$e;XS(zdqYivSRFDg{tA5|~1wVwzt3{=N~M ztT=@=ce{YLL10|~DE}2DjTK7$v9gjm40Nh*@t%ueGoXKv)&3uwC<7`a7E5A0xfJZi zD=a@=1Zd=4=^BjhI)uTowavgyU$)|_s;VM%$uslIoB17bt1F%MqA2XWs;W}ip5NW2 z7x%ed?c9Smq3gJD1r;P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00F5wwFlq>96GiyeOPJ486Fl} zX~gM$7dzCB4g9}b8pfky0EDv>8q|w-3(9IkwRTlfPtsROJxwo6N{Vu62ZKs*8G>Il zYc1yPE@G|4Imh^k!vNz_RQCa*_fH0v;-{S3yPIaM#nQ_*mv77iu(qCXZ>B_!SNAKG z{P}H0=&4*TtKO8}w56rDiJmRTsy<&;p-_+%o!RCW60EfV7z43Qh)w@&#rOX+!XO_! zum@udK$>XGCf04@oC8?%0g6YbGRb|mKo{SC%*^$(T$z4~F$u;dJh**|Fq~`vpZ(#j zTi`pT(lt7r4ghyXo=PQu75L->TzGUmlV1N=WqIy5-EJ3vTMtk2<>$A) z^@iogY73z5dBydi^`$5u1c8DekQ7~#qOnnH_C^?t0Y|p*gXa}{qYVB4hR7DAm{Ajz P00000NkvXXu0mjf=ML}Q literal 0 HcmV?d00001 diff --git a/src/databrowser/images/value.png b/src/databrowser/images/value.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4b8205e3f963a7278c263beacf92281a55e751 GIT binary patch literal 909 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 FV1j6QQr`do literal 0 HcmV?d00001 diff --git a/src/databrowser/images/value_delete.png b/src/databrowser/images/value_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..7038ead7c88fe82daddc08f502e20b2fd9ba012c GIT binary patch literal 1433 zcmV;K1!nq*P)NNot^az-nC=1Bu+vcv)E3cC`M5tM4)P`3IQsuP)iFbts(@8 z3e-to`bJxx5;=$hfj@wUDlMc%fdC;7Knu>sid#2GZHyDeF^+#{*Y?iN?)CVyPh2sMN@-o2nyq8SV%$3V!N~Kvm&!wZIgG?qv7>2lR9ZuR| zMPm~w$3_c5SgrEui4#NNo2*iVaZDUW#2TVRu)cLI2{8EY&xzs?$8q#k0JKI* z$=KK!^Ye3T-Li$o6^#rJ4+DaflfI-&5QafDN$^rG9r-+yGc%kTIE5A(B`tKa=zj%} zXpO!EsZ;`vesGL@K2JWM$FKMVl>iVVNsN(bnwnP7(9poZsn57@VH~9_48yqUm0vQV zD>n_pz%UF>pFYj#=ofT$ZY0~7rRrA+qY%%nqvBWiq_>wi46##cnW^TA*&^~sX9w4` zO1Vt<#QF2sQ9@r|fzJj`5$gyc1jFY?7#tjgL?fkjRn=O53GiNnGuPEJ%6*?4BAa#q z_`$#c_pTr1k@sK6FigfL#u>jb&cwt7#bOadN`$!fSt&1#XI2Q@4c}VDw!V|t%I5xj z3AARqbt^&$Ow$BmfKHI6v2ZXgsdnjzmwvzoz=loD`#(H%7KG;Rl~Zg}!<4f&?;n}s z(E6J(4Ff4nq%^QBiKQ$oYax_Ui`P<04AZ1m3rCj$Rv$apW5T|eDqi^1WloF*Z1cE4z0D)l$;wYk2n(eOy!LI#1`+C2;$wpj@bB$RE zwHkjrI>JXYUi{Dg88Bn)W|K8z{iIS3wtaa-5?k3gDVs11nVOn@$*)xI`YLk(=~$*k zEu{D8SUlye`TawMf9?MGv7h$;{lkNIOqXNKZ4cFo#p3Wyxm=r4HbMyEIA(Hk@_eZ@ zyK8^XzQfo2WghYDk2h}4{dx7Vb3I=r+P?kq2G{fUZtB{!0}W@+4E-Uf1l=#Z&@;yW nb3OOl=O2CUH^19)JvsjYfd>=$&H6i-00000NkvXXu0mjf_z$>1 literal 0 HcmV?d00001 diff --git a/src/databrowser/images/value_delete1.png b/src/databrowser/images/value_delete1.png new file mode 100644 index 0000000000000000000000000000000000000000..832b39205f5a161de798112a8d9f46d2f6949af6 GIT binary patch literal 929 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 brLunjt!Xv(EF**#00000NkvXXu0mjf&XcT1 literal 0 HcmV?d00001 diff --git a/src/databrowser/images/value_edit2.png b/src/databrowser/images/value_edit2.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd4d7cd7e54e9661ba8f16e83a2bae99440eded GIT binary patch literal 912 zcmV;B18@9^P)^F2opjzl^`Z?!coJ3C%{2GFe+s@D;Yv?|$R zflO^+%*1ThVk|G+21T$#wHCr{n~3h=he(pxI9{SVr>*q7>S%e_2>`sQv&{~-3_WEq z2q5*-4#6Mm!NnKHpy@Gm4&6sGGlF0=07X%l#by%4A#DI~4gh!n8Gm~iWitzjKt-JK z9e{48ku*lZfgqX;B9k^z;w(ob6(qqx7{1H-lij5o1F@lwxwNv@vq2v<$^);$NMuG( z%C zCx{QGz>5?QPh_F0;&<5XJQmhCv2{mt+~56oH4nfr4F&*=3LN=VFnj`Y;CO-u%}%KK zjVLLSv2UKA!Ubi2v1T*?LJ!SmD82lV11OTHV0WWb7trUX5qy1bF6sZmslN8LW z&O_bqBW8B_*_Eb|=>6xB=KoaAIo#4EL8i+DnR0|9%vGF6ZXH&Ti7$cbo{C?0m7-zq zpD8VR!_)755*jlLYmWc0K+X}bDtV$H>jf-u=Vzj6Cbq0CMB^VP{4XCJnx!X40$<-#?T90000. * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrconnectiondialog.h" +#include "ui_lrconnectiondialog.h" +#include "lrglobal.h" +#include +#include +#include +#include +#include +#include + +ConnectionDialog::ConnectionDialog(LimeReport::IConnectionController *conControl, LimeReport::ConnectionDesc* connectionDesc, QWidget *parent) : + QDialog(parent), + ui(new Ui::ConnectionDialog),m_connection(connectionDesc),m_controller(conControl) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose,true); + m_changeMode=m_connection!=0; +} + +ConnectionDialog::~ConnectionDialog() +{ + delete ui; +} + +void ConnectionDialog::init() +{ + ui->cbbDrivers->addItems(QSqlDatabase::drivers()); +} + +void ConnectionDialog::showEvent(QShowEvent *) +{ + connectionToUI(); +} + +void ConnectionDialog::slotAccept() +{ + try { + checkFieldsFill(); + if (ui->cbAutoConnect->isChecked()) checkConnection(); + if (!m_connection){ + m_controller->addConnectionDesc(uiToConnection()); + } else { + m_controller->changeConnectionDesc(uiToConnection()); + } + close(); + } + catch(LimeReport::ReportError &exception){ + QMessageBox::critical(this,tr("Error"),exception.what()); + } +} + +void ConnectionDialog::slotCheckConnection() +{ + try{ + checkConnection(); + QMessageBox::information(this,tr("Connection"),tr("Connection succsesfully established!")); + } catch(LimeReport::ReportError &exception) { + QMessageBox::critical(this,tr("Error"),exception.what()); + } +} + +void ConnectionDialog::checkFieldsFill() +{ + if (ui->leConnectionName->text().isEmpty()){throw LimeReport::ReportError(tr("Connection Name is empty"));} + if (!m_changeMode&&QSqlDatabase::connectionNames().contains(ui->leConnectionName->text())) { + throw LimeReport::ReportError(tr("Connection with name ")+ui->leConnectionName->text()+tr(" already exists ")); + } +} + +bool ConnectionDialog::checkConnection() +{ + bool connectionEstablished = false; + QString lastError; + { + QSqlDatabase db = QSqlDatabase::addDatabase(ui->cbbDrivers->currentText(),ui->leConnectionName->text()+"_check"); + db.setHostName(ui->leServerName->text()); + db.setUserName(ui->leUserName->text()); + db.setDatabaseName(ui->leDataBase->text()); + db.setPassword(ui->lePassword->text()); + connectionEstablished = db.open(); + if (!db.open()) { + lastError=db.lastError().text(); + } + } + QSqlDatabase::removeDatabase(ui->leConnectionName->text()+"_check"); + if (!connectionEstablished) throw LimeReport::ReportError(lastError); + return true; +} + +LimeReport::ConnectionDesc *ConnectionDialog::uiToConnection() +{ + if (!m_connection) m_connection = new LimeReport::ConnectionDesc(); + m_connection->setName(ui->leConnectionName->text()); + m_connection->setHost(ui->leServerName->text()); + m_connection->setDriver(ui->cbbDrivers->currentText()); + m_connection->setUserName(ui->leUserName->text()); + m_connection->setPassword(ui->lePassword->text()); + m_connection->setDatabaseName(ui->leDataBase->text()); + m_connection->setAutoconnect(ui->cbAutoConnect->isChecked()); + return m_connection; +} + +void ConnectionDialog::connectionToUI() +{ + init(); + if (!m_connection) return; + ui->leConnectionName->setText(m_connection->name()); + ui->leDataBase->setText(m_connection->databaseName()); + ui->leServerName->setText(m_connection->host()); + ui->leUserName->setText(m_connection->userName()); + ui->lePassword->setText(m_connection->password()); + ui->cbbDrivers->setCurrentIndex(ui->cbbDrivers->findText(m_connection->driver())); + ui->cbAutoConnect->setChecked(m_connection->autoconnect()); +} + + +void ConnectionDialog::on_toolButton_clicked() +{ + ui->leDataBase->setText(QFileDialog::getOpenFileName()); +} diff --git a/src/databrowser/lrconnectiondialog.h b/src/databrowser/lrconnectiondialog.h new file mode 100644 index 0000000..7d22dd9 --- /dev/null +++ b/src/databrowser/lrconnectiondialog.h @@ -0,0 +1,67 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRCONNECTIONDIALOG_H +#define LRCONNECTIONDIALOG_H + +#include +#include "lrdatadesignintf.h" + +namespace Ui { + class ConnectionDialog; +} + +class ConnectionDialog : public QDialog +{ + Q_OBJECT +public: + explicit ConnectionDialog(LimeReport::IConnectionController* conControl, LimeReport::ConnectionDesc* connectionDesc=0, QWidget *parent = 0); + ~ConnectionDialog(); +protected: + void showEvent(QShowEvent *); + void init(); + void checkFieldsFill(); + bool checkConnection(); + LimeReport::ConnectionDesc* uiToConnection(); + void connectionToUI(); +signals: + void conectionRegistred(LimeReport::ConnectionDesc* connectionDesc); +private slots: + void slotAccept(); + void slotCheckConnection(); + void on_toolButton_clicked(); + +private: + Ui::ConnectionDialog *ui; + LimeReport::ConnectionDesc* m_connection; + bool m_changeMode; + LimeReport::IConnectionController* m_controller; +}; + +#endif // LRCONNECTIONDIALOG_H diff --git a/src/databrowser/lrconnectiondialog.ui b/src/databrowser/lrconnectiondialog.ui new file mode 100644 index 0000000..b292cf5 --- /dev/null +++ b/src/databrowser/lrconnectiondialog.ui @@ -0,0 +1,249 @@ + + + ConnectionDialog + + + + 0 + 0 + 420 + 294 + + + + Connection + + + + :/databrowser/images/database_disconnected:/databrowser/images/database_disconnected + + + + + + + + Connection Name + + + + + + + + + + + + + + + + + + Driver + + + + + + + + + + Server + + + + + + + + + + + + + + User + + + + + + + + + + + + + + Password + + + + + + + + + + QLineEdit::Password + + + + + + + Database + + + + + + + 2 + + + + + + + + + + + + ... + + + + + + + + + + + Auto connect + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + Check connection + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + false + + + + + + + Ok + + + + + + + + + + + + + pbOk + clicked() + ConnectionDialog + slotAccept() + + + 388 + 266 + + + 376 + 215 + + + + + pbCancel + clicked() + ConnectionDialog + reject() + + + 268 + 263 + + + 255 + 225 + + + + + pbCheckConnection + clicked() + ConnectionDialog + slotCheckConnection() + + + 28 + 271 + + + 36 + 224 + + + + + + slotAccept() + slotCheckConnection() + + diff --git a/src/databrowser/lrdatabrowser.cpp b/src/databrowser/lrdatabrowser.cpp new file mode 100644 index 0000000..4bd07cb --- /dev/null +++ b/src/databrowser/lrdatabrowser.cpp @@ -0,0 +1,705 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ui_lrdatabrowser.h" + +#include "lrdatabrowser.h" +#include "lrsqleditdialog.h" +#include "lrconnectiondialog.h" +#include "lrreportengine_p.h" +#include "lrvariabledialog.h" +#include "lrdatabrowsertree.h" + +namespace LimeReport{ + +DataBrowser::DataBrowser(QWidget *parent) : + QWidget(parent), + ui(new Ui::DataBrowser), m_report(0), m_closingWindows(false), m_settings(0), m_ownedSettings(false) +{ + ui->setupUi(this); + connect(ui->addConnection,SIGNAL(clicked()),this,SLOT(slotAddConnection())); + connect(ui->deleteConection,SIGNAL(clicked()),this,SLOT(slotDeleteConnection())); + connect(ui->addDataSource,SIGNAL(clicked()),this,SLOT(slotAddDataSource())); + connect(ui->viewDataSource,SIGNAL(clicked()),this,SLOT(slotViewDatasource())); + connect(ui->editDataSource,SIGNAL(clicked()),this,SLOT(slotEditDatasource())); + connect(ui->deleteDataSource,SIGNAL(clicked()),this,SLOT(slotDeleteDatasource())); + connect(ui->changeConnection,SIGNAL(clicked()),this,SLOT(slotChangeConnection())); + connect(ui->pbConnect,SIGNAL(clicked()),this,SLOT(slotChangeConnectionState())); + + ui->dataTree->setHeaderLabel(tr("Datasources")); + ui->pbConnect->setEnabled(false); +} + +DataBrowser::~DataBrowser() +{ + delete ui; + if (m_settings && m_ownedSettings) + delete m_settings; +} +QSize DataBrowser::sizeHint() const +{ + return QSize(100,200); +} + +void DataBrowser::slotAddConnection() +{ + ConnectionDialog *connectionEdit = new ConnectionDialog(this,0,this); + connectionEdit->setAttribute(Qt::WA_DeleteOnClose,true); +#if defined(WIN32) || defined(WIN64) + connectionEdit->setWindowModality(Qt::ApplicationModal); +#else + connectionEdit->setWindowModality(Qt::WindowModal); +#endif + //connect(connectionEdit,SIGNAL(finished(int)),this,SLOT(slotConnectionEditFinished(int))); + //connect(connectionEdit,SIGNAL(conectionRegistred(QString)),this,SLOT(slotConnectionRegistred(QString))); + connectionEdit->exec(); +} + +void DataBrowser::slotSQLEditingFinished(SQLEditResult result) +{ + if (result.dialogMode==SQLEditDialog::AddMode) { + switch (result.resultMode) { + case SQLEditResult::Query: + addQuery(result); + break; + case SQLEditResult::SubQuery: + addSubQuery(result); + break; + case SQLEditResult::SubProxy: + addProxy(result); + default: + break; + } + } else { + switch(result.resultMode){ + case SQLEditResult::Query: + changeQuery(result); + break; + case SQLEditResult::SubQuery: + changeSubQuery(result); + break; + case SQLEditResult::SubProxy: + changeProxy(result); + } + } + + updateDataTree(); +} + +void DataBrowser::slotDeleteConnection() +{ + if (!getConnectionName().isEmpty()){ + if ( + QMessageBox::critical( + this, + tr("Attention"), + tr("Do you really want delete \"%1\" connection ?").arg(getConnectionName()), + QMessageBox::Ok|QMessageBox::No, + QMessageBox::No + )==QMessageBox::Ok + ){ + m_report->dataManager()->removeConnection(getConnectionName()); + updateDataTree(); + } + } +} + +void DataBrowser::slotAddDataSource() +{ + SQLEditDialog *sqlEdit = new SQLEditDialog(this,m_report->dataManager(),SQLEditDialog::AddMode); + sqlEdit->setAttribute(Qt::WA_DeleteOnClose,true); +#if defined(WIN64) || defined(WIN32) + sqlEdit->setWindowModality(Qt::ApplicationModal); +#else + sqlEdit->setWindowModality(Qt::WindowModal); +#endif + sqlEdit->setSettings(settings()); + sqlEdit->setDataSources(m_report->dataManager()); + sqlEdit->setDefaultConnection(getConnectionName()); + connect(sqlEdit,SIGNAL(signalSqlEditingFinished(SQLEditResult)),this,SLOT(slotSQLEditingFinished(SQLEditResult))); + sqlEdit->exec(); +} + +void DataBrowser::updateDataTree() +{ + QString selectedText = ""; + int selectedType = 0; + + if (ui->dataTree->selectedItems().count()==1){ + selectedType = ui->dataTree->selectedItems().at(0)->type(); + selectedText = ui->dataTree->selectedItems().at(0)->text(0); + } + + initConnections(); + + foreach(QString dataSourceName, m_report->datasourcesNames()){ + + QTreeWidgetItem *item=new QTreeWidgetItem(QStringList(dataSourceName),DataBrowserTree::Table); + QTreeWidgetItem *parentItem = findByNameAndType(m_report->dataManager()->connectionName(dataSourceName),DataBrowserTree::Connection); + if (parentItem){ + parentItem->addChild(item); + if (!parentItem->isExpanded()) ui->dataTree->expandItem(parentItem); + } else { + ui->dataTree->addTopLevelItem(item); + } + + try{ + IDataSource* datasource = m_report->dataManager()->dataSource(dataSourceName); + if (datasource){ + fillFields(item,datasource); + if (!datasource->isInvalid()) + item->setIcon(0,QIcon(":/databrowser/images/table_good")); + else + item->setIcon(0,QIcon(":/databrowser/images/table_error")); + + } else item->setIcon(0,QIcon(":/databrowser/images/table_error")); + + } catch(ReportError& exception) { + item->setIcon(0,QIcon(":/databrowser/images/table_error")); + //qDebug()<setSelected(true); + ui->dataTree->setCurrentItem(selectedItem); + } +} + +void DataBrowser::updateVariablesTree() +{ + ui->variablesTree->clear(); + QTreeWidgetItem *userVariables =new QTreeWidgetItem(QStringList(tr("User variables")),DataBrowserTree::Category); + userVariables->setIcon(0,QIcon(":/report/images/folder")); + QTreeWidgetItem *systemVariables =new QTreeWidgetItem(QStringList(tr("System variables")),DataBrowserTree::Category); + systemVariables->setIcon(0,QIcon(":/report/images/folder")); + ui->variablesTree->addTopLevelItem(userVariables); + ui->variablesTree->addTopLevelItem(systemVariables); + + foreach(QString variableName,m_report->dataManager()->variableNames()){ + QStringList values; + values<dataManager()->variableIsSystem(variableName))? + "": + " ["+m_report->dataManager()->variable(variableName).toString()+"]" + ) + <setIcon(0,QIcon(":/databrowser/images/value")); + if (m_report->dataManager()->variableIsSystem(variableName)){ + systemVariables->addChild(item); + } else { + userVariables->addChild(item); + } + } + + ui->variablesTree->expandItem(userVariables); + ui->variablesTree->expandItem(systemVariables); +} + +void DataBrowser::closeAllDataWindows() +{ + m_closingWindows = true; + QMap::iterator it = m_dataWindows.begin(); + for(;it!=m_dataWindows.end();){ + (*it)->close(); + delete (*it); + it = m_dataWindows.erase(it); + } + m_closingWindows = false; +} + +void DataBrowser::setSettings(QSettings *value, bool owned) +{ + if (m_settings && m_ownedSettings) delete m_settings; + m_settings=value; + m_ownedSettings = owned; +} + +QSettings *DataBrowser::settings() +{ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings = true; + return m_settings; + } +} + +void DataBrowser::slotDatasourcesChanged() +{ + updateDataTree(); +} + +void DataBrowser::fillFields(QTreeWidgetItem *parentItem, LimeReport::IDataSource *dataSource) +{ + if (!dataSource) return; + for (int i=0;icolumnCount();i++){ + QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(dataSource->columnNameByIndex(i)),DataBrowserTree::Row); + item->setIcon(0,QIcon(":/databrowser/images/field")); + parentItem->addChild(item); + } + parentItem->sortChildren(0,Qt::AscendingOrder); +} + +QTreeWidgetItem * DataBrowser::findByNameAndType(QString name, int itemType) +{ + if (name.isEmpty()) return 0; + QListitems = ui->dataTree->findItems(name,Qt::MatchContains | Qt::MatchRecursive); + if (!items.isEmpty()){ + for (int i=0;itype()==itemType)/* && (items.at(0)->text(0)==name)*/){ return items.at(i);} + } + } + return 0; +} + +void DataBrowser::slotViewDatasource() +{ + QString datasourceName=getDatasourceName(); + if (!datasourceName.isEmpty()){ + showDataWindow(datasourceName); + } +} + +QString DataBrowser::getDatasourceName() +{ + if (ui->dataTree->currentItem()){ + if (ui->dataTree->currentItem()->type() == DataBrowserTree::Table) return ui->dataTree->currentItem()->text(0); + if (ui->dataTree->currentItem()->type() == DataBrowserTree::Row) return ui->dataTree->currentItem()->parent()->text(0); + }; + return QString(); +} + +QTreeWidgetItem* findConnectionItem(QTreeWidgetItem* item){ + if (item->type() == DataBrowserTree::Connection){ + return item; + } else { + if (item->parent()) + return findConnectionItem(item->parent()); + else + return 0; + } +} + +QString DataBrowser::getConnectionName() +{ + if (ui->dataTree->currentItem()){ + QTreeWidgetItem * ci = findConnectionItem(ui->dataTree->currentItem()); + if (ci) return ci->text(0); + else return QString(); + }; + return QString(); +} + +QString DataBrowser::getVariable() +{ + if(ui->variablesTree->currentItem()&&ui->variablesTree->currentItem()->type() == DataBrowserTree::Variable){ + return ui->variablesTree->currentItem()->text(1); + } + return QString(); +} + +void DataBrowser::slotEditDatasource() +{ + if (!getDatasourceName().isEmpty()){ + closeDataWindow(getDatasourceName()); + SQLEditDialog *sqlEdit = new SQLEditDialog(this,m_report->dataManager(),SQLEditDialog::EditMode); + sqlEdit->setAttribute(Qt::WA_DeleteOnClose); +#if defined(WIN32) || defined(WIN64) + sqlEdit->setWindowModality(Qt::ApplicationModal); +#else + sqlEdit->setWindowModality(Qt::WindowModal); +#endif + sqlEdit->setSettings(settings()); + sqlEdit->setDataSources(m_report->dataManager(),getDatasourceName()); + connect(sqlEdit,SIGNAL(signalSqlEditingFinished(SQLEditResult)),this,SLOT(slotSQLEditingFinished(SQLEditResult))); + sqlEdit->exec(); + } +} + +void DataBrowser::slotDeleteDatasource() +{ + QString datasourceName=getDatasourceName(); + QTreeWidgetItem *item = findByNameAndType(datasourceName, DataBrowserTree::Table); + if (item){ + if ( + QMessageBox::critical( + this, + tr("Attention"), + tr("Do you really want delete \"%1\" datasource ?").arg(datasourceName), + QMessageBox::Ok|QMessageBox::No, + QMessageBox::No + )==QMessageBox::Ok + ){ + removeDatasource(datasourceName); + } + } +} + +void DataBrowser::setReportEditor(LimeReport::ReportDesignWidget *report) +{ + m_report=report; + connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); + connect(m_report->dataManager(), SIGNAL(datasourcesChanged()), this, SLOT(slotDatasourcesChanged())); + updateDataTree(); + updateVariablesTree(); +} + +void DataBrowser::slotClear() +{ + ui->dataTree->clear(); + foreach(QDockWidget* window,m_dataWindows.values()) window->close(); + updateDataTree(); +} + +void DataBrowser::initConnections() +{ + ui->dataTree->clear(); + QListitems; + foreach(QString connectionName,m_report->dataManager()->connectionNames()){ + QTreeWidgetItem *item=new QTreeWidgetItem(ui->dataTree,QStringList(connectionName), DataBrowserTree::Connection); + if (m_report->dataManager()->isConnectionConnected(connectionName)) + item->setIcon(0,QIcon(":/databrowser/images/database_connected")); + else + item->setIcon(0,QIcon(":/databrowser/images/database_disconnected")); + items.append(item); + } + ui->dataTree->insertTopLevelItems(0,items); +} + +QDockWidget *DataBrowser::createDataWindow(QString datasourceName) +{ + QDockWidget *window = new QDockWidget("Table: "+datasourceName); + QTableView *tableView = new QTableView(window); + //TODO: exception or message ? + + try { + IDataSource* datasource = m_report->dataManager()->dataSource(datasourceName); + if (datasource){ + tableView->setModel(datasource->model()); + } + } catch (ReportError& exception) { + qDebug()<setWidget(tableView); + window->setAttribute(Qt::WA_DeleteOnClose); + connect(window,SIGNAL(destroyed()),this,SLOT(slotDataWindowClosed())); + + if (!m_dataWindows.isEmpty()) + m_mainWindow->tabifyDockWidget(m_dataWindows.values().at(0),window); + else + m_mainWindow->addDockWidget(Qt::BottomDockWidgetArea,window); + + m_dataWindows.insert(datasourceName,window); + + return window; +} + +QDockWidget *DataBrowser::dataWindow(QString datasourceName) +{ + if (m_dataWindows.contains(datasourceName)){ + return m_dataWindows.value(datasourceName); + } else return createDataWindow(datasourceName); +} + +void DataBrowser::setMainWindow(QMainWindow *mainWindow) +{ + m_mainWindow=mainWindow; +} + +void DataBrowser::slotDataWindowClosed() +{ + if (isClosingWindows()) return; + for (int i=0;idataManager()->connectionByName(getConnectionName()), + this + ); + connectionEdit->setAttribute(Qt::WA_DeleteOnClose,true); +#if defined(WIN32) || defined(WIN64) + connectionEdit->setWindowModality(Qt::ApplicationModal); +#else + connectionEdit->setWindowModality(Qt::WindowModal); +#endif + //connect(connectionEdit,SIGNAL(finished(int)),this,SLOT(slotConnectionEditFinished(int))); + connectionEdit->exec(); + } +} + +void DataBrowser::slotChangeConnectionState() +{ + QString connectionName = getConnectionName(); + if (!connectionName.isEmpty()){ + if (!m_report->dataManager()->isConnectionConnected(connectionName)){ + setCursor(Qt::WaitCursor); + //try { + if (!m_report->dataManager()->connectConnection(connectionName)){ + //} catch(std::runtime_error &exception) { + QMessageBox::critical(this,tr("Attention"),m_report->dataManager()->lastError()); + //} + } + updateDataTree(); + setCursor(Qt::ArrowCursor); + } else { + m_report->dataManager()->disconnectConnection(connectionName); + updateDataTree(); + } + } +} + +void DataBrowser::slotVariableEditorAccept(const QString &variable) +{ + updateVariablesTree(); + QList items = ui->variablesTree->findItems(variable, Qt::MatchContains | Qt::MatchRecursive); + if (!items.isEmpty()){ + ui->variablesTree->setCurrentItem(items.at(0)); + } +} + +void DataBrowser::showDataWindow(QString datasourceName) +{ + QDockWidget *window = dataWindow(datasourceName); + if (window){ + window->show(); + window->raise(); + } +} + +void DataBrowser::closeDataWindow(QString datasourceName) +{ + if (m_dataWindows.contains(datasourceName)) + m_dataWindows.value(datasourceName)->close(); +} + +void DataBrowser::removeDatasource(QString datasourceName) +{ + closeDataWindow(datasourceName); + m_report->dataManager()->removeDatasource(datasourceName); +} + +void DataBrowser::addQuery(SQLEditResult result) +{ + try { + m_report->dataManager()->addQuery(result.datasourceName, result.sql, result.connectionName); + } catch(ReportError &exception){ + qDebug()<dataManager()->removeDatasource(result.oldDatasourceName); + m_report->dataManager()->addQuery(result.datasourceName, result.sql, result.connectionName); + }catch(ReportError &exception){ + qDebug()<dataManager()->addSubQuery(result.datasourceName, result.sql, result.connectionName, result.masterDatasource); + } catch(ReportError &exception){ + qDebug()<dataManager()->removeDatasource(result.oldDatasourceName); + m_report->dataManager()->addSubQuery(result.datasourceName, result.sql, result.connectionName, result.masterDatasource); + }catch(ReportError &exception){ + qDebug()<dataManager()->addProxy(result.datasourceName,result.masterDatasource,result.childDataSource,result.fieldMap); + } catch(ReportError &exception){ + qDebug()<dataManager()->removeDatasource(result.oldDatasourceName); + m_report->dataManager()->addProxy(result.datasourceName,result.masterDatasource,result.childDataSource,result.fieldMap); + } catch(ReportError &exception){ + qDebug()<dataManager()->addConnectionDesc(connection); + updateDataTree(); +} + +void DataBrowser::changeConnectionDesc(ConnectionDesc *connection) +{ + Q_UNUSED(connection) + updateDataTree(); +} + +void DataBrowser::on_dataTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) +{ + Q_UNUSED(previous) + if (current&&(current->type() == DataBrowserTree::Connection)) { + ui->pbConnect->setEnabled(true); + if (m_report->dataManager()->isConnectionConnected(current->text(0))){ + ui->pbConnect->setIcon(QIcon(":/databrowser/images/plug-connect.png")); + } else { + ui->pbConnect->setIcon(QIcon(":/databrowser/images/plug-disconnect.png")); + } + ui->editDataSource->setEnabled(false); + ui->deleteDataSource->setEnabled(false); + ui->viewDataSource->setEnabled(false); + ui->changeConnection->setEnabled(true); + ui->deleteConection->setEnabled(true); + ui->errorMessage->setDisabled(true); + } else { + ui->changeConnection->setEnabled(false); + ui->deleteConection->setEnabled(false); + ui->pbConnect->setEnabled(false); + IDataSourceHolder* holder = m_report->dataManager()->dataSourceHolder(getDatasourceName()); + if (holder){ + ui->viewDataSource->setEnabled(!holder->isInvalid()); + ui->editDataSource->setEnabled(holder->isEditable()); + ui->deleteDataSource->setEnabled(holder->isRemovable()); + if (!holder->lastError().isEmpty()){ + ui->errorMessage->setEnabled(true); + } else {ui->errorMessage->setEnabled(false);} + } + } +} + +void LimeReport::DataBrowser::on_addVariable_clicked() +{ + LRVariableDialog dialog(this); +#if defined(WIN32) || defined(WIN64) + dialog.setWindowModality(Qt::ApplicationModal); +#else + dialog.setWindowModality(Qt::WindowModal); +#endif + dialog.setVariableContainer(m_report->dataManager()); + connect(&dialog,SIGNAL(signalVariableAccepted(QString)),this,SLOT(slotVariableEditorAccept(QString))); + dialog.exec(); + +} + +void DataBrowser::on_editVariable_clicked() +{ + if (!getVariable().isEmpty()) + { + LRVariableDialog dialog(this); +#if defined(WIN32) || defined(WIN64) + dialog.setWindowModality(Qt::ApplicationModal); +#else + dialog.setWindowModality(Qt::WindowModal); +#endif + dialog.setVariableContainer(m_report->dataManager()); + QString varName = getVariable(); + dialog.setVariableName(varName); + connect(&dialog,SIGNAL(signalVariableAccepted(QString)),this,SLOT(slotVariableEditorAccept(QString))); + dialog.exec(); + } +} + +void DataBrowser::on_deleteVariable_clicked() +{ + QString varName = getVariable(); + if (!varName.isEmpty()){ + if (QMessageBox::critical(this,tr("Attention"),QString(tr("Do you really want delete variable \"%1\" ?")).arg(varName), + QMessageBox::Ok|QMessageBox::Cancel, QMessageBox::Cancel + )==QMessageBox::Ok){ + m_report->dataManager()->deleteVariable(varName); + updateVariablesTree(); + } + } +} + +void DataBrowser::on_variablesTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) +{ + Q_UNUSED(previous) + + if (current){ + if (m_report->dataManager()->containsVariable(current->text(1))&& + !m_report->dataManager()->variableIsSystem(current->text(1)) + ){ + ui->editVariable->setEnabled(true); + ui->deleteVariable->setEnabled(true); + } else { + ui->editVariable->setEnabled(false); + ui->deleteVariable->setEnabled(false); + } + } +} + +void DataBrowser::on_errorMessage_clicked() +{ + if(!getDatasourceName().isEmpty()&&m_report->dataManager()->dataSourceHolder(getDatasourceName())){ + QMessageBox::critical(this,tr("Error"),m_report->dataManager()->dataSourceHolder(getDatasourceName())->lastError()); + } +} + +} // namespace LimeReport + + + + diff --git a/src/databrowser/lrdatabrowser.h b/src/databrowser/lrdatabrowser.h new file mode 100644 index 0000000..06b10d3 --- /dev/null +++ b/src/databrowser/lrdatabrowser.h @@ -0,0 +1,115 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATABROWSER_H +#define LRDATABROWSER_H + +#include +#include +#include +#include + +#include "lrreportdesignwidget.h" +#include "lrsqleditdialog.h" + +namespace Ui { + class DataBrowser; +} +namespace LimeReport{ + +class DataBrowser : public QWidget, public IConnectionController +{ + Q_OBJECT +public: + + explicit DataBrowser(QWidget *parent = 0); + ~DataBrowser(); + QSize sizeHint() const; + void setReportEditor(LimeReport::ReportDesignWidget* report); + void setMainWindow(QMainWindow* mainWindow); + void initConnections(); + void updateDataTree(); + void updateVariablesTree(); + void closeAllDataWindows(); + void setSettings(QSettings* value, bool owned = false); + QSettings* settings(); +private slots: + void slotDatasourcesChanged(); + void slotAddConnection(); + void slotDeleteConnection(); + void slotAddDataSource(); + void slotViewDatasource(); + void slotEditDatasource(); + void slotDeleteDatasource(); + void slotSQLEditingFinished(SQLEditResult result); + void slotClear(); + void slotDataWindowClosed(); + void slotChangeConnection(); + void slotChangeConnectionState(); + void slotVariableEditorAccept(const QString &variable); + void on_dataTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); + void on_editVariable_clicked(); + void on_deleteVariable_clicked(); + void on_addVariable_clicked(); + void on_variablesTree_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); + void on_errorMessage_clicked(); +private: + QString getDatasourceName(); + QString getConnectionName(); + QString getVariable(); + bool isClosingWindows() const {return m_closingWindows;} + QTreeWidgetItem * findByNameAndType(QString name, int itemType); + void fillFields(QTreeWidgetItem *parentItem, LimeReport::IDataSource *dataSource); + QDockWidget* createDataWindow(QString datasourceName); + void closeDataWindow(QString datasourceName); + QDockWidget* dataWindow(QString datasourceName); + void showDataWindow(QString datasourceName); + void removeDatasource(QString datasourceName); + void addQuery(SQLEditResult result); + void changeQuery(SQLEditResult result); + void addSubQuery(SQLEditResult result); + void changeSubQuery(SQLEditResult result); + void addProxy(SQLEditResult result); + void changeProxy(SQLEditResult result); + + void addConnectionDesc(ConnectionDesc *connection); + void changeConnectionDesc(ConnectionDesc *connection); + +private: + Ui::DataBrowser* ui; + ReportDesignWidget* m_report; + QMap m_dataWindows; + QMainWindow* m_mainWindow; + bool m_closingWindows; + QSettings* m_settings; + bool m_ownedSettings; +}; + +} +#endif // LRDATABROWSER_H diff --git a/src/databrowser/lrdatabrowser.qrc b/src/databrowser/lrdatabrowser.qrc new file mode 100644 index 0000000..7a46b64 --- /dev/null +++ b/src/databrowser/lrdatabrowser.qrc @@ -0,0 +1,47 @@ + + + images/data_add.png + images/data_delete.png + images/table.png + images/table_delete.png + images/data.png + images/row.png + images/edit_table.png + images/table_view.png + images/value_add.png + images/value_delete.png + images/value_edit.png + images/value.png + images/data_edit.png + images/add.png + images/remove.png + images/plug-connect.png + images/plug-disconnect.png + images/database_connect.png + images/database_disconnect.png + images/database_connected.png + images/database_connected2.png + images/table_error.png + images/table_good.png + images/error_message.png + images/error_message_2.png + images/data1.png + images/database_connected3.png + images/field.png + images/table_error1.png + images/table_good1.png + images/data_add1.png + images/data_delete1.png + images/data_edit1.png + images/table_add.png + images/table_delete1.png + images/table_edit.png + images/table_view1.png + images/value_add1.png + images/value_delete1.png + images/value_edit1.png + images/value_add2.png + images/value_edit2.png + images/value1.png + + diff --git a/src/databrowser/lrdatabrowser.ui b/src/databrowser/lrdatabrowser.ui new file mode 100644 index 0000000..f5c4a05 --- /dev/null +++ b/src/databrowser/lrdatabrowser.ui @@ -0,0 +1,484 @@ + + + DataBrowser + + + + 0 + 0 + 400 + 300 + + + + Datasources + + + + 1 + + + 1 + + + 1 + + + 1 + + + 2 + + + + + QTabWidget::South + + + 0 + + + + Datasources + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + 2 + + + + + Add database connection + + + ... + + + + :/databrowser/images/database_add:/databrowser/images/database_add + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/database_edit:/databrowser/images/database_edit + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/database_delete:/databrowser/images/database_delete + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/plug-connect.png:/databrowser/images/plug-connect.png + + + + 16 + 16 + + + + true + + + + + + + QFrame::VLine + + + QFrame::Sunken + + + + + + + + + + ... + + + + :/databrowser/images/table_add:/databrowser/images/table_add + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/table_view:/databrowser/images/table_view + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/table_edit:/databrowser/images/table_edit + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/table_delete:/databrowser/images/table_delete + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/error_message_2.png:/databrowser/images/error_message_2.png + + + + 16 + 16 + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + true + + + true + + + QAbstractItemView::DragOnly + + + false + + + + 1 + + + + + + + + + Variables + + + + 2 + + + 2 + + + 2 + + + 2 + + + + + 2 + + + + + ... + + + + :/databrowser/images/value_add:/databrowser/images/value_add + + + + 16 + 16 + + + + QToolButton::DelayedPopup + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/value_edit:/databrowser/images/value_edit + + + + 16 + 16 + + + + true + + + + + + + false + + + ... + + + + :/databrowser/images/value_delete:/databrowser/images/value_delete + + + + 16 + 16 + + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + true + + + QAbstractItemView::DragOnly + + + true + + + 1 + + + false + + + + 1 + + + + + + + + + + + + + DataBrowserTree + QTreeWidget +

lrdatabrowsertree.h
+ + + + dataTree + addConnection + changeConnection + deleteConection + pbConnect + addDataSource + viewDataSource + editDataSource + deleteDataSource + variablesTree + addVariable + editVariable + deleteVariable + tabWidget + + + + + + + slotAddDataSource() + slotDeleteDataSource() + + diff --git a/src/databrowser/lrdatabrowsertree.cpp b/src/databrowser/lrdatabrowsertree.cpp new file mode 100644 index 0000000..b1fb944 --- /dev/null +++ b/src/databrowser/lrdatabrowsertree.cpp @@ -0,0 +1,47 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrdatabrowsertree.h" +#include +#include + +DataBrowserTree::DataBrowserTree(QWidget *parent) : + QTreeWidget(parent){} + +QMimeData *DataBrowserTree::mimeData(const QList items) const +{ + QMimeData* result = QTreeWidget::mimeData(items); + if (items.at(0)->type()==Row){ + result->setText("$D{"+items.at(0)->parent()->text(0)+"."+items.at(0)->data(0,Qt::DisplayRole).toString()+"}"); + } + if (items.at(0)->type()==Variable){ + result->setText("$V{"+items.at(0)->text(0)+"}"); + } + return result; +} diff --git a/src/databrowser/lrdatabrowsertree.h b/src/databrowser/lrdatabrowsertree.h new file mode 100644 index 0000000..1a44eb5 --- /dev/null +++ b/src/databrowser/lrdatabrowsertree.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATABROWSERTREE_H +#define LRDATABROWSERTREE_H + +#include + +class DataBrowserTree : public QTreeWidget +{ + Q_OBJECT +public: + enum NodeType{Connection,Table,Row,Category,Variable}; + explicit DataBrowserTree(QWidget *parent = 0); +protected: + QMimeData* mimeData(const QList items) const; + +public slots: + +}; + +#endif // LRDATABROWSERTREE_H diff --git a/src/databrowser/lrsqleditdialog.cpp b/src/databrowser/lrsqleditdialog.cpp new file mode 100644 index 0000000..ca20a32 --- /dev/null +++ b/src/databrowser/lrsqleditdialog.cpp @@ -0,0 +1,343 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrsqleditdialog.h" +#include "ui_lrsqleditdialog.h" +#include "lrreportengine_p.h" + +#include +#include +#include + +SQLEditDialog::SQLEditDialog(QWidget *parent, LimeReport::DataSourceManager *dataSources, SQLDialogMode dialogMode) : + QDialog(parent), + ui(new Ui::SQLEditDialog),m_datasources(dataSources),m_dialogMode(dialogMode), m_oldDatasourceName(""), + m_settings(0), m_ownedSettings(false) +{ + ui->setupUi(this); + m_masterDatasources = new QCompleter(this); + ui->leMaster->setCompleter(m_masterDatasources); + ui->leChild->setCompleter(m_masterDatasources); + ui->gbFieldsMap->setVisible(false); + ui->gbDataPreview->setVisible(false); + ui->pbHidePreview->setVisible(false); + ui->rbSubQuery->setChecked(true); + ui->rbProxy->setVisible(false); + ui->rbSubQuery->setVisible(false); + ui->leMaster->setVisible(false); + ui->lbMaster->setVisible(false); + ui->fieldsMap->setHorizontalHeaderItem(0,new QTableWidgetItem("master")); + ui->fieldsMap->setHorizontalHeaderItem(1,new QTableWidgetItem("detail")); + +#ifdef HAVE_QT5 + ui->fieldsMap->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); +#else + ui->fieldsMap->horizontalHeader()->setResizeMode(QHeaderView::Stretch); +#endif + ui->pnlChildDatasource->setVisible(false); + connect(ui->pbPreview, SIGNAL(pressed()), this, SLOT(slotPreviewData())); + connect(ui->pbHidePreview, SIGNAL(pressed()), this, SLOT(slotHidePreview())); +} + +SQLEditDialog::~SQLEditDialog() +{ + delete ui; + if (m_settings && m_ownedSettings) + delete m_settings; +} + +QSettings *SQLEditDialog::settings(){ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings = true; + return m_settings; + } +} + +void SQLEditDialog::setSettings(QSettings *value, bool owned){ + if (m_settings && m_ownedSettings) delete m_settings; + m_settings=value; + m_ownedSettings = owned; +} + +void SQLEditDialog::accept() +{ + SQLEditResult result; + + if (!ui->cbSubdetail->isChecked()){ + result.resultMode=SQLEditResult::Query; + } else { + if (ui->rbSubQuery->isChecked()) result.resultMode=SQLEditResult::SubQuery; + else result.resultMode=SQLEditResult::SubProxy; + } + + result.connectionName=ui->cbbConnection->currentText(); + result.datasourceName=ui->leDatasourceName->text(); + result.sql=ui->textEditSQL->toPlainText(); + result.dialogMode=m_dialogMode; + result.oldDatasourceName=m_oldDatasourceName; + result.subdetail = ui->cbSubdetail->isChecked(); + result.masterDatasource=ui->leMaster->text(); + result.childDataSource=ui->leChild->text(); + + if (ui->fieldsMap->rowCount()>0){ + for(int i=0;ifieldsMap->rowCount();++i){ + LimeReport::FieldsCorrelation fieldsCorrelation; + fieldsCorrelation.master=ui->fieldsMap->item(i,0)->data(Qt::DisplayRole).toString(); + fieldsCorrelation.detail=ui->fieldsMap->item(i,1)->data(Qt::DisplayRole).toString(); + result.fieldMap.append(fieldsCorrelation); + } + } + + try { + check(); + emit signalSqlEditingFinished(result); + QDialog::accept(); + }catch(LimeReport::ReportError &exception){ + QMessageBox::critical(this,tr("Error"),exception.what()); + } +} + +void SQLEditDialog::showEvent(QShowEvent *) +{ + ui->lblInfo->setVisible(false); + initConnections(); + readSettings(); +} + +void SQLEditDialog::closeEvent(QCloseEvent *) +{ + writeSetting(); +} + +void SQLEditDialog::hideEvent(QHideEvent *) +{ + writeSetting(); +} + +void SQLEditDialog::check() +{ + if (ui->leDatasourceName->text().isEmpty()) throw LimeReport::ReportError(tr("Datasource Name is empty !")); + if (ui->textEditSQL->toPlainText().isEmpty() && (!ui->rbProxy) ) throw LimeReport::ReportError(tr("SQL is empty !")); + if (m_dialogMode==AddMode){ + if (m_datasources->containsDatasource(ui->leDatasourceName->text())){ + throw LimeReport::ReportError(QString(tr("Datasource with name: \"%1\" already exists !")).arg(ui->leDatasourceName->text())); + } + } +} + +void SQLEditDialog::initConnections() +{ + foreach(QString connectionName, QSqlDatabase::connectionNames()){ + ui->cbbConnection->addItem(QIcon(":/databrowser/images/plug-connect.png"),connectionName); + } + foreach(QString connectionName, m_datasources->connectionNames()){ + if (ui->cbbConnection->findText(connectionName,Qt::MatchExactly )==-1) + ui->cbbConnection->addItem(QIcon(":/databrowser/images/plug-disconnect.png"),connectionName); + } + ui->cbbConnection->setCurrentIndex(ui->cbbConnection->findText(m_defaultConnection)); + if (!m_oldDatasourceName.isEmpty()){ + ui->cbbConnection->setCurrentIndex(ui->cbbConnection->findText(m_datasources->connectionName(m_oldDatasourceName))); + } +} + +void SQLEditDialog::setDataSources(LimeReport::DataSourceManager *dataSources, QString datasourceName) +{ + m_datasources=dataSources; + if (!datasourceName.isEmpty()){ + ui->cbSubdetail->setEnabled(false); + initQueryMode(); + m_oldDatasourceName=datasourceName; + ui->leDatasourceName->setText(datasourceName); + ui->textEditSQL->setText(dataSources->queryText(datasourceName)); + if (dataSources->isSubQuery(datasourceName)){ + initSubQueryMode(); + ui->leMaster->setText(dataSources->subQueryByName(datasourceName)->master()); + } + if (dataSources->isProxy(datasourceName)){ + initProxyMode(); + LimeReport::ProxyDesc* proxyDesc = dataSources->proxyByName(datasourceName); + ui->leChild->setText(proxyDesc->child()); + ui->leMaster->setText(proxyDesc->master()); + int curIndex=0; + foreach(LimeReport::FieldMapDesc* fields, *proxyDesc->fieldsMap()){ + ui->fieldsMap->setRowCount(curIndex+1); + ui->fieldsMap->setItem(curIndex,0,new QTableWidgetItem(fields->master())); + ui->fieldsMap->setItem(curIndex,1,new QTableWidgetItem(fields->detail())); + curIndex++; + } + } + } +} + +void SQLEditDialog::setDefaultConnection(QString defaultConnection) +{ + m_defaultConnection=defaultConnection; +} + +void SQLEditDialog::slotDataSourceNameEditing() +{ + if (m_dialogMode==AddMode){ + QPalette palette=ui->leDatasourceName->palette(); + if (m_datasources->containsDatasource(ui->leDatasourceName->text())){ + palette.setColor(QPalette::Text,Qt::red); + ui->leDatasourceName->setPalette(palette); + ui->lblInfo->setText(QString(tr("Datasource with name %1 already exist")).arg(ui->leDatasourceName->text())); + ui->lblInfo->setVisible(true); + } else { + palette.setColor(QPalette::Text,QApplication::palette().text().color()); + ui->leDatasourceName->setPalette(palette); + ui->lblInfo->setVisible(false); + } + } +} + +void SQLEditDialog::on_cbSubdetail_clicked(bool checked) +{ + if (checked){ + m_masterDatasources->setModel(new QStringListModel(m_datasources->dataSourceNames(),m_datasources)); + } + ui->leMaster->setEnabled(checked); + ui->rbProxy->setEnabled(checked); + ui->rbSubQuery->setEnabled(checked); + if ((checked)&&(ui->rbProxy->isChecked())) initProxyMode(); + if ((checked)&&(ui->rbSubQuery->isChecked())) initSubQueryMode(); + if (!checked) initQueryMode(); +} + +void SQLEditDialog::on_rbProxy_clicked(bool checked) +{ + if (checked) initProxyMode(); +} + +void SQLEditDialog::on_rbSubQuery_clicked(bool checked) +{ + if (checked) initSubQueryMode(); +} + +void SQLEditDialog::on_pbAddField_clicked() +{ + ui->fieldsMap->setRowCount(ui->fieldsMap->rowCount()+1); +} + +void SQLEditDialog::initQueryMode() +{ + ui->gbSQL->setVisible(true); + ui->gbFieldsMap->setVisible(false); + ui->pnlChildDatasource->setVisible(false); + ui->rbSubQuery->setVisible(false); + ui->rbProxy->setVisible(false); + ui->cbSubdetail->setChecked(false); + ui->leMaster->setVisible(false); + ui->lbMaster->setVisible(false); +} + +void SQLEditDialog::initSubQueryMode() +{ + ui->gbSQL->setVisible(true); + ui->gbFieldsMap->setVisible(false); + ui->pnlChildDatasource->setVisible(false); + ui->rbSubQuery->setChecked(true); + ui->cbSubdetail->setChecked(true); + ui->rbSubQuery->setVisible(true); + ui->rbProxy->setVisible(true); + ui->leMaster->setVisible(true); + ui->leMaster->setEnabled(true); + ui->lbMaster->setVisible(true); + +} + +void SQLEditDialog::initProxyMode() +{ + ui->gbSQL->setVisible(false); + ui->gbFieldsMap->setVisible(true); + ui->pnlChildDatasource->setVisible(true); + ui->rbProxy->setChecked(true); + ui->cbSubdetail->setChecked(true); + ui->rbSubQuery->setVisible(true); + ui->rbProxy->setVisible(true); + ui->leMaster->setVisible(true); + ui->leMaster->setEnabled(true); + ui->lbMaster->setVisible(true); + ui->cbSubdetail->setEnabled(false); +} + +void SQLEditDialog::slotPreviewData() +{ + if (ui->cbbConnection->currentText().isEmpty()){ + QMessageBox::critical(this,tr("Attention"),tr("Connection is not specified")); + return; + } + m_previewModel = m_datasources->previewSQL(ui->cbbConnection->currentText(),ui->textEditSQL->toPlainText()); + if (m_previewModel){ + ui->tvPreview->setModel(m_previewModel.data()); + ui->gbDataPreview->setVisible(true); + ui->pbPreview->setText(tr("Refresh")); + ui->pbHidePreview->setVisible(true); + } else { + if (ui->gbDataPreview->isVisible()) + hidePreview(); + QMessageBox::critical(this,tr("Attention"),m_datasources->lastError()); + } +} + +void SQLEditDialog::slotHidePreview() +{ + hidePreview(); +} + +void SQLEditDialog::writeSetting() +{ + if (settings()!=0){ + settings()->beginGroup("SQLEditor"); + settings()->setValue("Geometry",saveGeometry()); + settings()->endGroup(); + } +} + +void SQLEditDialog::readSettings() +{ + if (settings()==0) return; + settings()->beginGroup("SQLEditor"); + QVariant v = settings()->value("Geometry"); + if (v.isValid()){ + restoreGeometry(v.toByteArray()); + } + settings()->endGroup(); +} + +void SQLEditDialog::hidePreview() +{ + ui->gbDataPreview->setVisible(false); + ui->pbPreview->setText(tr("Preview")); + ui->pbHidePreview->setVisible(false); +} + diff --git a/src/databrowser/lrsqleditdialog.h b/src/databrowser/lrsqleditdialog.h new file mode 100644 index 0000000..8122824 --- /dev/null +++ b/src/databrowser/lrsqleditdialog.h @@ -0,0 +1,109 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSQLEDITDIALOG_H +#define LRSQLEDITDIALOG_H + +#include +#include +#include +#include +#include "lrreportengine_p.h" +#include "lrdatasourcemanager.h" +#include "lrdatadesignintf.h" + +namespace Ui { + class SQLEditDialog; +} + +struct SQLEditResult; + +class SQLEditDialog : public QDialog +{ + Q_OBJECT + +public: + enum SQLDialogMode {AddMode,EditMode}; + explicit SQLEditDialog(QWidget *parent, LimeReport::DataSourceManager* dataSources,SQLDialogMode dialogMode); + void setDataSources(LimeReport::DataSourceManager *dataSources,QString datasourceName=""); + void setDefaultConnection(QString defaultConnection); + ~SQLEditDialog(); + QSettings* settings(); + void setSettings(QSettings* value, bool owned = false); +signals: + void signalSqlEditingFinished(SQLEditResult result); +protected: + void showEvent(QShowEvent *); + void closeEvent(QCloseEvent*); + void hideEvent(QHideEvent*); + void check(); + void initConnections(); +private slots: + void accept(); + void slotDataSourceNameEditing(); + void on_cbSubdetail_clicked(bool checked); + void on_rbProxy_clicked(bool checked); + void on_rbSubQuery_clicked(bool checked); + void on_pbAddField_clicked(); + void initQueryMode(); + void initSubQueryMode(); + void initProxyMode(); + void slotPreviewData(); + void slotHidePreview(); +private: + void writeSetting(); + void readSettings(); + void hidePreview(); +private: + Ui::SQLEditDialog *ui; + LimeReport::DataSourceManager* m_datasources; + SQLDialogMode m_dialogMode; + QString m_oldDatasourceName; + QCompleter* m_masterDatasources; + QString m_defaultConnection; + QSettings* m_settings; + bool m_ownedSettings; + QSharedPointer m_previewModel; +}; + +struct SQLEditResult{ + enum ResultMode{Query,SubQuery,SubProxy}; + QString connectionName; + QString datasourceName; + QString oldDatasourceName; + QString sql; + bool subdetail; + ResultMode resultMode; + QString masterDatasource; + QString childDataSource; + SQLEditDialog::SQLDialogMode dialogMode; + QList fieldMap; +}; + +#endif // LRSQLEDITDIALOG_H diff --git a/src/databrowser/lrsqleditdialog.ui b/src/databrowser/lrsqleditdialog.ui new file mode 100644 index 0000000..9e9116c --- /dev/null +++ b/src/databrowser/lrsqleditdialog.ui @@ -0,0 +1,859 @@ + + + SQLEditDialog + + + + 0 + 0 + 411 + 617 + + + + Datasource + + + + :/databrowser/images/database_disconnected:/databrowser/images/database_disconnected + + + + + + + + + + + Connection + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + + + + + + + + + + + Datasource Name + + + + + + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 127 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 191 + + + + + + + 127 + 127 + 63 + + + + + + + 170 + 170 + 84 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 191 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 127 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 191 + + + + + + + 127 + 127 + 63 + + + + + + + 170 + 170 + 84 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 191 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 127 + 127 + 63 + + + + + + + 255 + 255 + 127 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 191 + + + + + + + 127 + 127 + 63 + + + + + + + 170 + 170 + 84 + + + + + + + 127 + 127 + 63 + + + + + + + 255 + 255 + 255 + + + + + + + 127 + 127 + 63 + + + + + + + 255 + 255 + 127 + + + + + + + 255 + 255 + 127 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 127 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + true + + + + + + -1 + + + + + + + + + + + Subdetail + + + + + + + + + Master datasource + + + + + + + false + + + + + + + + + false + + + Subquery mode + + + + + + + false + + + Filter mode + + + + + + + + + SQL + + + + 4 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Preview + + + + + + + Hide Preview + + + + + + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + Child datasource + + + + + + + + + + + + + + + Fields map + + + + 4 + + + 4 + + + 4 + + + 4 + + + + + 2 + + + + + + + + + + + ... + + + + :/databrowser/images/add.png:/databrowser/images/add.png + + + true + + + + + + + ... + + + + :/databrowser/images/remove.png:/databrowser/images/remove.png + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Data preview + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Cancel + + + false + + + + + + + Ok + + + false + + + + + + + + + leDatasourceName + cbSubdetail + leMaster + rbSubQuery + rbProxy + textEditSQL + leChild + fieldsMap + pbAddField + pbDelField + pushButton_2 + pushButton + + + + + + + leDatasourceName + textChanged(QString) + SQLEditDialog + slotDataSourceNameEditing() + + + 259 + 54 + + + 289 + 32 + + + + + pushButton + clicked() + SQLEditDialog + accept() + + + 397 + 536 + + + 380 + 360 + + + + + pushButton_2 + clicked() + SQLEditDialog + reject() + + + 278 + 538 + + + 299 + 383 + + + + + + slotDataSourceNameEditing() + + diff --git a/src/databrowser/lrvariabledialog.cpp b/src/databrowser/lrvariabledialog.cpp new file mode 100644 index 0000000..a2d5dec --- /dev/null +++ b/src/databrowser/lrvariabledialog.cpp @@ -0,0 +1,99 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrvariabledialog.h" +#include "ui_lrvariabledialog.h" +#include "lrglobal.h" +#include +#include + +LRVariableDialog::LRVariableDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::LRVariableDialog), + m_variableName(""), + m_variablesContainer(0), + m_changeMode(false), + m_oldVariableName("") +{ + ui->setupUi(this); + ui->cbbType->setVisible(false); + ui->lblType->setVisible(false); +} + +LRVariableDialog::~LRVariableDialog() +{ + delete ui; +} + +void LRVariableDialog::setVariableContainer(LimeReport::IVariablesContainer *value) +{ + m_variablesContainer=value; +} + +void LRVariableDialog::setVariableName(const QString &value) +{ + m_variableName=value; + m_changeMode=true; + m_oldVariableName=value; +} + +void LRVariableDialog::showEvent(QShowEvent *) +{ + ui->leName->setText(m_variableName); + if (!m_variableName.isEmpty()&&m_variablesContainer&&m_variablesContainer->containsVariable(m_variableName)){ + ui->leValue->setText(m_variablesContainer->variable(m_variableName).toString()); + } +} + +void LRVariableDialog::accept() +{ + try{ + if (m_variablesContainer&&!ui->leName->text().isEmpty()){ + if (m_changeMode){ + if (m_oldVariableName==ui->leName->text()){ + m_variablesContainer->changeVariable(m_oldVariableName,value()); + } else { + m_variablesContainer->deleteVariable(m_oldVariableName); + m_variablesContainer->addVariable(ui->leName->text(),value()); + } + } else { + m_variablesContainer->addVariable(ui->leName->text(),value()); + } + emit signalVariableAccepted(ui->leName->text()); + QDialog::accept(); + } + } catch (LimeReport::ReportError &exception){ + QMessageBox::critical(this,tr("Attention"),exception.what()); + } +} + +QVariant LRVariableDialog::value() +{ + return ui->leValue->text(); +} diff --git a/src/databrowser/lrvariabledialog.h b/src/databrowser/lrvariabledialog.h new file mode 100644 index 0000000..49ba046 --- /dev/null +++ b/src/databrowser/lrvariabledialog.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRVARIABLEDIALOG_H +#define LRVARIABLEDIALOG_H + +#include +#include "lrvariablesholder.h" + +namespace Ui { +class LRVariableDialog; +} + +class LRVariableDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LRVariableDialog(QWidget *parent = 0); + ~LRVariableDialog(); + void setVariableContainer(LimeReport::IVariablesContainer *value); + void setVariableName(const QString &value); +protected: + void showEvent(QShowEvent *); +private slots: + void accept(); +signals: + void signalVariableAccepted(const QString &variable); +private: + QVariant value(); +private: + Ui::LRVariableDialog *ui; + QString m_variableName; + LimeReport::IVariablesContainer* m_variablesContainer; + bool m_changeMode; + QString m_oldVariableName; +}; + +#endif // LRVARIABLEDIALOG_H diff --git a/src/databrowser/lrvariabledialog.ui b/src/databrowser/lrvariabledialog.ui new file mode 100644 index 0000000..df97830 --- /dev/null +++ b/src/databrowser/lrvariabledialog.ui @@ -0,0 +1,131 @@ + + + LRVariableDialog + + + + 0 + 0 + 218 + 126 + + + + Variable + + + + :/databrowser/images/value:/databrowser/images/value + + + + 2 + + + 4 + + + 4 + + + 4 + + + 4 + + + + + 7 + + + 5 + + + 4 + + + 8 + + + + + Name + + + + + + + + + + Value + + + + + + + + + + + + + Type + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + LRVariableDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + LRVariableDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/images/Control-Edit Box.png b/src/images/Control-Edit Box.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0fb75eb36f851eaca0a8099810725cf3105747 GIT binary patch literal 618 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 literal 0 HcmV?d00001 diff --git a/src/images/barcode.png b/src/images/barcode.png new file mode 100644 index 0000000000000000000000000000000000000000..19669cd3de2f2dd9c8f3d0d7aeb9e4bb66fc402f GIT binary patch literal 4488 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 a0)yZNlOsK`dpm$mV(@hJb6Mw<&;$UP!c*}8 literal 0 HcmV?d00001 diff --git a/src/images/barcode3_16.png b/src/images/barcode3_16.png new file mode 100644 index 0000000000000000000000000000000000000000..80d93976652ce600247feec61c730b085a9697b4 GIT binary patch literal 521 zcmV+k0`~ohP)WFU8GbZ8({Xk{QrNlj1+3MgYKATls8GayP~Yjt8ECu(VJ zZDC_4AX9W@X>Mh5Co}I@0003@NklU=I*!;$)=mGFHun?K=77* zh=evx5vbCzu$`2j4O~l(<)iWEIWsZ9HIToY*8(y#`RO=KC$9cp@uvy9-42Hd8#}OF z_fb|EN7Y?)05^bbo*th7@$hiZ-TfUxY`0qkY;JD>=(-L8<#Pdu@C*W>7I7I}M@nA- zC2b*+QsP7N`Wk_Rwv06ug@ zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj1+3MgYKATls8GayP~Yjt8ECu(VJ zZDC_4AX9W@X>Mh5Co}I@0005pNkl5SuKy;bRPAHeT6yK2op0uwZ^!U59x*-w{!H@(m;zD{ zz}@}HQPy?MY&HXU3*1b`2J7`2Nnx50hQ+nXz`~wMm|15VZHl~TT+M;p#sHGIyu3gX ztJMXo)mIRlpPz%^%h?$MvMeJ_Qvi}AAxRQMpAcRFIsh;kp!hVP2Vo3Wt)&mPg1-Y2 zEgG3d4%Hr3x5US1UH=AXvTrsU zUn~}$Z#JIixfglvMNxQBmR@d4ueMvSs>*M7x4zr$e81m&UDtm4>C}JT-TC$P_oiLE z2WEC}4a~^03`t~JMwX^XB1u1o_cC0r<#O3&(iGz8jfuTzTW))@>+~l=Dy zAn`oUna}3{AAoNI6;)M5Q5Hi^QSaSTlR|A;F(~$|`%A#dGq&q1;2rR~k2eM0#4b2J zypxX_zknaW&A8!AVi&Y0{ucg3kl!!=@dw9W`Mjw*SMt;X00000NkvXXu0mjf8juzI literal 0 HcmV?d00001 diff --git a/src/images/bottomLine.png b/src/images/bottomLine.png new file mode 100644 index 0000000000000000000000000000000000000000..70cacbd190f7ccb86ccd5e6960046d88dd50ee13 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy2e4h@jtbkO6U?E{-7<)vGj;-g!)uACFl9Cb<5;IPeHZECkAa4g_3R4{0D#juvmS?$YZH|m99=4ume%ETt v!^6`9#Al8q%@CJZnD$5ga-LgPEI-4Fr*ixz86NULn;1M@{an^LB{Ts5#~?ge literal 0 HcmV?d00001 diff --git a/src/images/bottomLine1.png b/src/images/bottomLine1.png new file mode 100644 index 0000000000000000000000000000000000000000..6566228a0e24796bcb531fa7f65edec8359a70f6 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy7OWn&O`zH=t0Or;B5V#p&dP1#BzqvNtaOwdSZ? z(TxJ;6C1v$xUSQ?k$>RC0U&T$$GzjHMcH9q1>p}y0lX806%6u?4SBd6c=c=K3iRJ3 zCL|=J0I{0b;XPm-3G-KcnlIDMe{TO_kBzSx|JNHaZ_{c22DFjE)78&qol`;+0GTpM AJpcdz literal 0 HcmV?d00001 diff --git a/src/images/bringToFront.png b/src/images/bringToFront.png new file mode 100644 index 0000000000000000000000000000000000000000..b411bbf44b3d6ba434e21472c11783bc2e64659b GIT binary patch literal 497 zcmV>MZ~O0e(qD zK~zY`wN*QE!Y~xvCpj`9#LSlY~MDqT=CkIP@-lU#)^OFa*8c?L{my z1lOI88GL@YaV#HWpvF!+KeBsr5(ptn6a7*D6QC$x69JIsPLO$DLPG!$>t)()%s?q+ z?|;m|BLISdN)QMdGA|V2wMfM=8~z1=7=$PXDVi|tsJs9tFG07wY1$*Y; zeuB5fqO_R+t}5UFF>t%NKQucA>Pz=WcN?adY7}!|S}#-4SVfNP2pVLO5EDmDLVW}$ zpLH!*qcv>^q(h}wbz6e6*9Dxe0GqyjXik%a+E{eF)&ZYL0RXR)3GAx$Wq^F63zDie zO!IEH3$};@ks&GW*0GoE_h%4r8+285i6G0`6RekM@Y#Pj{Iw&f`yzRzJdIvz=e~c! n%G4Q~%{Kgx782+Dn=cms)2vx*#dj&h00000NkvXXu0mjf@EpY= literal 0 HcmV?d00001 diff --git a/src/images/closebox.png b/src/images/closebox.png new file mode 100644 index 0000000000000000000000000000000000000000..46d90bc410efc6949328086d5e3066b32b48b56c GIT binary patch literal 18315 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

miJHg+$x6-d4)FT3Z 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 literal 0 HcmV?d00001 diff --git a/src/images/copy2.png b/src/images/copy2.png new file mode 100644 index 0000000000000000000000000000000000000000..da050ea624bd9c5451311f5be0927cd5e300275e GIT binary patch literal 769 zcmV+c1OEJpP)862FvHb%oDugZq zN{b5@mI^{_QQDQDrKP1GS%gAqvxp_wA_VFz6q!1?^O4ESz31z7kxY}2;=2>A+G() z`Nf zrrta^I`Q^}11e~3{QSK+I>YXq5zC#$+kE!xRc`+AB?}K1@Zzv8rBp2*`u_K?Z)Jka zOTZPN<39_=X#fh#|L|Sm8+=y^D*^YG=jp#c#0TT289(w)^--~K;^^q>&ENj|ab&ew z3pO%v8ZVA|QbQ@&-P?yVo;a@Xr2d2(KV^CMjZ?42m6%LhmiY&>c##bY)~0yxNlXLp zgg9=XwM7J6Mp!KU$*EnyU zVQh-A2_gb&(=!^I;>8hVJLn-#ceazqr6O6S$hL(TaU`aJb}4~tLl8i1C|JwD)6{kL z=7-3ckf<%BTwNiq#55YKXqRAYf;LS=JXIj&c1Mv{*FFeRa1H# zv+&>^D~%euWdXJ6C%P12O@THkVJ5@LJ%<_Y86+7#Vwq~I5-ebJR ziUF~Ju&bvR)l%s!xm<)7i&7$i+N8j^lq6}k-@JRR#B(r4mx4gKN-;U$t!x~C5n?q|N00000NkvXXu0mjfvG!gB literal 0 HcmV?d00001 diff --git a/src/images/copy24.png b/src/images/copy24.png new file mode 100644 index 0000000000000000000000000000000000000000..4c21085e2bef9d3c05ad32fa6b21f575ad759894 GIT binary patch literal 862 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 TQ@)9N00000NkvXXu0mjf@?iIC literal 0 HcmV?d00001 diff --git a/src/images/cut16.png b/src/images/cut16.png new file mode 100644 index 0000000000000000000000000000000000000000..edd18441362eb47286358593a12b1da4342d8a15 GIT binary patch literal 727 zcmV;|0x127P)A$vFoQE>B(N)_5DRhDh?0nv7IsRSYvA_ViEFi> z)i#3v!4~3Qk+5EFb30QQ5D|i48j~sf1jE3jm}D|Jb8@!133xxaFC2JzKOTPXd(P2L zPf!0X6bgUy3)|e>Gy(ZtqFgR3rIZ>Dhe`;cj*pMk<>lo#7KWkneP7jTH3b;o_Uj{O zI2>Y{CZ$q|^Ye4w-rmqOjW~{}R;z4mY*4G!5@6zo08P^XSX^AhbzN?6Z%LAbR4O$t z{t6kq16Y@f zY&L1NTI6y$q9`Jh$zT`;?RJ}NHcP2gB93E}Qgk{U{hfk#yG^lJWM*cDX0yrt{XJ4j z3WWmK*VjBeJYX0Gwr%4$4z_Loc!|r)%dD@jK?_&j0N`w&f`+aQNW_Nd&Y&MJMd2DTMk2%U)G$KvY{yI51`BNV?2q72@1`Gy+ zu`h&RX=#aiy-v5=MF_#%+?))<(B0eHn~I|7vp$ml?NLhM`#v`}H|V;~GEeDpyxm^m@JT>P!H`FfdK?9Z1)8EXxAGbzP>XrwPLl zDc^rcZDC>I!~XvMCw^j@rUfrAFPVHk@3-6S-vAB|4>Ldq;D7V?Xn=y-X5s(<002ov JPDHLkV1h7WPp1F? literal 0 HcmV?d00001 diff --git a/src/images/cut24.png b/src/images/cut24.png new file mode 100644 index 0000000000000000000000000000000000000000..c87f2886f22347f0af3d342bdd63fc863e11dd26 GIT binary patch literal 1236 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 literal 0 HcmV?d00001 diff --git a/src/images/delete.png b/src/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ebb0809ac91b9b6a8fbce0bfa4cfbbf4292742 GIT binary patch literal 4304 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 y07n7r+!y3_0od_GPR3=Do3K3P)1ZYV_ zK~zY`#g$8lUBwoLzqP7r@AFE!J0?DIxnOXp21L|MyiU}S6A^JDh}R41SOf!tpopM2 z5nmTcoah~>b5R_q12v*z+6S$O(ZrFij|mw#U{K=G^h$*g9U9# z?%K3`mzM7xo5?S^>F%o@I|1M~1IE?h(Nq0ntw?1qXahG99GC${iiUat6F^9oq=-Yx zG-7FR#>BI)wY&QqaQg)SgQxe-?7MYg^=Af)1>zGX35!NbhFJq}f~cT6c}jAKDO0<5 za9QsP7RM+5cR>xF{q$bG{^5(g-EQyXuHGIxoeoJN$s(x`ED2@_i-Nj|r#jF~P;p?w zV0DG1m9xBj#}PSUAMj7P>30PWUH>Zgzj1@5n2KKq3weL2gv{fEBlw&=bZEN{-UZB{ zP6b6AvQ`Z#$}#1*!fH@a0G@p75op?NQ%lJZ_;%;i4thIVs27YxOf|{si5g3oHOeev zW_a(|v9oKPoh{5b4)F4wA9Fzs)X8#+_Wts@!8NURM(`O~2zZx~yAHW)<1}CxM8hzW zC5kbOset}i(~3isB4=$FDqLC zDe_%PECW)G3x4|kB$K&PR*FStXTQR!!^}9lGSB?{X^aF0mZ%Ym2j4ufJpk;-6jOg) zj?erg=YUxvnh~d1FQd)2LQyAq-cYd-x;J8EIZeL{SYP3hB#-NaW_)Cp#j z8Ub^__)k*=Aj%IG4N=SmU7vEC1SYmM&JJ}Gpa3b^F&DJ_OF)YDVXO^7#AUj1W1s;@ za}hzDKqD&Ew)n#BA644{r0J@#bbRz>tW!k62c5*X$&{`u0#I={Cs;C4G%JVo8jv+{ zWGlb{Env?(&wO_p!vW|<4GhI0AvL~+Qw3+3VHT zT}N{5;+#iBX!#Ci1||e)Bc`^ruySU3e)QFm*N=a>^*1bkkfJG3W-QU#f7_+|_Z^tI zF5ltyw5P&M9`c@Z-mQ&Rm#a}44*TU&IgF?0-dp_q*pdF6D3vA70V_?rCfU+JzR6$S zJOkiETl4Nrmiv}ERiRjmu^PuX>{nx;ZgvF}&8~q6*l!kWD!`RgKy&~A002ovPDHLk FV1mCWKY#!L literal 0 HcmV?d00001 diff --git a/src/images/design.png b/src/images/design.png new file mode 100644 index 0000000000000000000000000000000000000000..c3fd61d48b4bfd26f5c34afc890ba6f0bf220ed1 GIT binary patch literal 19280 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 XrJ6_bcRR`r00000NkvXXu0mjfq-|A@ literal 0 HcmV?d00001 diff --git a/src/images/document-new_16.png b/src/images/document-new_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d3661a19448536ff21d00638827cfc744166e2ff GIT binary patch literal 600 zcmV-e0;m0nP)Pe)vKc4qRtGnCr*_GI z&<-LLOQ;2h4n;v6Dh|@sEK2v(A`P|*jhjl)%MS-7BzH;P-1|7(UA!Evec<7Jxx4S@ z`P_S_fJ;E0^J(w61vOITye7oJ=w<2h*(ORRFn&_8bci8>2 z%i@(qHuIZ2tUZ{|{>na6J4!TwmH!Xl{<2NOZ*cIf48ZqB89QofEUOMcCZhpRN{tP4 z!l3!PiFe-{17F{%h0i}#R~-PYHHe_1SI|m@`v@?1eGcc9;s$WIBoxbvj{;oA)$!zU zIOew#10yvIyTSVRiH~=bb5KTV|kgO08pF^Y`SA6YU0I6{LM*^_cVy&gu^8_%H z2B|=!WH<)g@_gS81_Lq1OaMegTCKKSTVFp&PmWsw m7l11#Op(Q1V zRw!Qfrb@gGY>B;ze?p-k2sY4vKq%N-^`@jvYB9xZ!IlyOyU|THX0}z6X4lEi$9a1( zJCn)gvp;w_=gbVx{LcHnb4G~>FC%qbCCE_H3H@auRme$?^wiht^9J(+C;3Lsi3^~B zVkh?3I~-w@iQ#vLa~E?L!RZiEaI<=o+mCNo$nv3lAq@o#EiTn3wN@yl2}Xt1I&i3h zwI?oTe?CjLKg;%xrHQzyR&!5XEM;R;nM*8 z*ZgCiu2rbFH;}Y|W+WMR9D?)?@M^P)`^;r!+}f7F(-k42Kvsk9E00000NkvXXu0mjft<0`O literal 0 HcmV?d00001 diff --git a/src/images/document_add.png b/src/images/document_add.png new file mode 100644 index 0000000000000000000000000000000000000000..dc06d2189a25709a03ae30601a8ba355e5a9d512 GIT binary patch literal 1000 zcmV>P)WdKcYATc!{L3L*!GB7YTATcpIGch_bG$1Q5F)%RM{uz1z000McNliru z(+C_24<;(Zdm{h<010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00Tft zL_t(|+PzjyNK{c2KKIRxKcQwbn0U_}Tth{y^Q|*9Er8d5_%vd&g2tKWT++r3fCWpU zbJZ!t%qQT6mXDu*7yvGGE>Q6=+&nB>6sC2m6U%~vpamhiLJ~D=;CkCE6v?P`QAx*) zV3>=hii|m9xx2h4;zj|A!@F_+)#R^a;V>z{DLUqwp_O?;HhQDYZ4G;&xnY+BGO10; zfzZ-)(`Dvv#7kpglWgur&Pl7bZ4+;PsZRj_v|Wd&^sOTm!m9^4U)~)tlt`1#C5Rj+ z1}XrWz_}4G0P_Lxj1#1V2cS+SJSEAOTN-yOr-B~HUfP*MwF*pHbH~H%D$;b=8GP~# zsiMofcB)NMqn&HIvZ_dHow=2)%130VNZ#A@@~QS)hNh!0_-0oIT&^D8dIoml^0k0yJhq)y&pS6^gFbD~}B=sqr!Ruk9~L W_AqYvh03o00000ZTL14v0k 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 literal 0 HcmV?d00001 diff --git a/src/images/document_zoom_in.png b/src/images/document_zoom_in.png new file mode 100644 index 0000000000000000000000000000000000000000..5d46e3efa46254dd30b51c9fd0057ee802639007 GIT binary patch literal 1214 zcmV;v1VQ_WP)WdKcYATc!{L3L*!GB7YTATcpIGch_bG$1Q5F)%RM{uz1z000McNliru z(+L*{CnX1R{_Fq%010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00b6E zL_t(|+Pzk7Y*SSje(r6%cBLy@7dFZUV=)-33@Qttn2B1O0@ zo}6>;J?DMi_j#Z9o&x`Ilkyk4-abs1Ijf-%RlJc@3RR-oNGT{)S!Zj5gsE%SuiQ)< zJNkQH{$<{1`#$=b&bOWX{#V-Z;{IsQn|&>%Y|8lyN~k`e!qZ&m-V+vu!ro_CCu~cl zy&Q|(ZhKau1JA$aeQ16Fvd)+!v0q;28zu2r%o%H-46v@U9L?LFu1L#@zx(w=8}AAr zgBDMeB;{~L=O|gCpuu6m`o>CZ=zg|>mYGiO+XlKWIBnTPfx)2 zR+oW{(@5mX*k42vVsuqOl}?zjV!Z!uQj0 zwxzl#08ePK7LUg<;Pc^pD8%vvELrS?r>z~e&N`G^0Gr*4>Y6IlH`K#FI_|h*1eB70 z8IOd+@cBpJ+UUW`9bJ$!Kr|A?z{s~)<642H=5<<)FybiZju!Gpz|zKhP)QO{CWn!w2E64N zf_L{AjAa%`7sn7DAH}_{2jDyGg=sddMKGsW3n(Ia5#(gIb$b^k$AcIRa#R>5pm(B=FA3*R^hvVQ_kwyehI2TG`j8z;0-&G)ZfgH;bUBb&{NOUGm? zLzGqbk1bx1~Q~V0@inA0SmWKsA_CXZ>T0-ZR9;&Zo~9fmw|q!vQy`P z~F c82*p;58~-9-oyz}xBvhE07*qoM6N<$f*R2#82|tP literal 0 HcmV?d00001 diff --git a/src/images/document_zoom_in_1.png b/src/images/document_zoom_in_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a73a4bf09efd35d67376dcc3a591f9fbece97090 GIT binary patch literal 1148 zcmV-?1cUpDP)}Jomp3=Rps6Jo2UP?cV*| z+jHO7b6x-Idj9Yq4;8uD@Y;Tvm61xw)Sy6VK`RNbB8X^21Z7iP?diWf;*TpoRJ-x# zNu#~7<4c+BIQHEyQvS>bp7pQP700^Mh}?)N)`K7sQ;T3~A!G^xQ!s&K*A&tV3S2=Y z$7^2PyJ&I%hNYNNsK^Nz3X}?Kssuy}naNWqtavQRZ-knvU)sIojsOM{y--Sx;i6Qy zazQghw%ft|Ims-pej-T{;*UMGW%uHk09wazgHjllD-_T-FhuK5=cqq;gg+V@Ai?hR zj$ChCyXnKFk>}#ZUn7$;gQ;OLwX)TjU=(E+?( zFURZaxp4kGV!({_3`!ndL0U#8Qyk!QC6YQlg{nohO5Z_7Z$yyfz~-d^gPn#o;K z!raO#i~xB0JREQSnuWRdFt4yEoDmeF0MRjAWHA_9eLf#Y8=EP6vWkMNG~V3aO3mi| z*b@_RFR$k8?-%L1cwvIPDi*-aRg2Kl@;$jFD~JQ)BjnQ}WZFh4C|ylU^9e+(GaB>+ z22mx_68?_1wsWjqwvwl}wIU(}LV`VM8e8}6M*DKu`g|D!ULOLML<%*5LDV8^5flnj zG`>;z>p~|04p$l@o*ss;*+KrX!e?MpilC_xt9?xUX zp^iXE|BAD2GS#|89sX zkru%-B>4U2Esa}S{XmD?HKM>2!BmMEpMO-&nk|Rv>dxoonk@G1x_mim)312$U2(fp zFwKboR)7>JtpV+faFC(Fz6a{+>Q3{2jDG>Qv@Rv%?VgPQ O0000WdKcYATc!{L3L*!GB7YTATcpIGch_bG$1Q5F)%RM{uz1z000McNliru z(+L*{CovtUDvs983!uGRFRCc7?>%_`n z(3>N)|G77MH!lxBG8iL-{R)I1Bw|^N8Ec>nu%_IJmfcT!GLkaX{pOKv{|X?1mJSpl zd0ZhJC8sK=^T~Lyp&VPfpYc$;?ex9_N4A&(XqrhjFwK&Y6

QQuzM-IKszI;g`Wd z!0vD-ZeEYx1rcgni)>a!I-Nm$F@;|*&A3m6zdOl}RF(wb z0WH-Mi3Iw?VN6X&Rt6B-xeNY44V*II_PS76U4h!VS`3{X^WD({O4WZTpO3{5 z9vVi|wh-1n-Gys6fZ0Fh&_5i(#->Izx3uat!ib}sJ6g6ohYqw)AxSV$zr zo=y?38Da)N4FD<*s?3^X8klCvl({R0XAo7b&CM9aC&9uL=NLHE2$%^b02&q6Xa-N! zz6vB#Y1AM4oGq$iPf>t0`&>vYqI~Xk$)M2h@gNgw>Vd9YGh*?`_8mAA9e`s)2S_#} z_~pv&k_1_Hf&LtYRW3t}W!ehgT_S-rvn&Et3;-%XRyW*@ay1EMB7zLHA}hJ!w0mHe z-5|e>AU1Xu_clF%@X=n_uE%r_mK1A|2WpWA`oWGpU6>df#Ym(FR}(h`=M`l#yj6az zzHc2I4h3C-Z?NL69;k=L@p#*M9Q(i|i$oAz-ek0axXhANQ6OWF~W=EV=_h%m; z#@62lP~F+W%DW1_gPYL&(n<3|)97uA@?d&rJ&fkwUHIgM&el7`0Jm~lP?gUP;~T0cuikUXINezI^e^DVIpEwypx%SI&|XZ| zZyGE~5w|p+qR3>5ze&VMUH%qm`g1J;s`8gkl@ag#6Ak;TabSMXDs!IWk0up}&*qCT~&G1@aAv|a_8cm1~ z#`vIUq9L(qz#1{es4=K14ZVQDdI{RtBK4XAeNanlq1w(2%x&-G!#S0<3}at(Cp-J> zWbgIw|6l()3;yGwrfzmT{ia-7kV9M>P@s%pl-R2XA_fsbxfCPA7ltlHQtID(edjl` zM%(ksM>5-S_|xyC{^6I$w?ElZlPsn+bt77w4?(6(BZ4+UTnkYxXdug%Mt)V5FQ%mJ z!AB3=G&=yxQA{b+)CpJ$l(IEd0%C-stTd{(+?5%z;+>6;HLdRwV^6CW#xA!g5@pfb(M^zWVYct#2RV=k|7R&+!H> z{nc^LuGiK~y_YgQjLgam+CW`x6}2^siAFWyaD?%R5Wfr#dk?jK@gb0t5I`g`Kp+sH zt+kcY0|ST!h4}^4-gY~A1x2KJ!0SsVXI?hNrNwj}@AF@kfr!2$`1#RMT06TaUtP=M zdmH%kB8>d{2W?#)EHA%~CDkkK8bKin5R=434ui=x7!2}BM;Dv7HBeQYhhH1g<54nv zKK$z%>G|mlgJ(|9kXI!GxV#z>y1PH)mbyDh1Kc7gATvdg>#-Yh^|ognn`y)t#AsZe44PhgjeS|s7Hlv~uj2OaNa9b80Pdf5rHz}SB&JB-| zGdIg-kjzC$+yM}bKuOsGvUHGme+LmsA!>O^b7$iAcu{9hFxq#VMdcM7dFLQwV_}=Y zjAEU}Ku=>}AKbjPf&RW;PIT=|ZZk(V_q${3ixqCKHRMuhQ@5Q*q38nzX3F$A>#M>cNqWx002ovPDHLkV1l+j B2@e1O literal 0 HcmV?d00001 diff --git a/src/images/edit-copy_1_16.png b/src/images/edit-copy_1_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd48c494924874a088590a749193994d075c22f GIT binary patch literal 498 zcmVl*+}S4tk-SEw(HMMH$UOFgT8OyWIuox(>z|!eNT?Q)#FJN+p=4fyzsz3(&M5 z1Oj8QEH>2c<<$iq9`D@|1fH*+ou9fEhcV03wkV2NSzd)@nNYt}lHgoRaN9}vHG1pg5Cj3DD1s1zdc6*S;N$b%7N-)ik literal 0 HcmV?d00001 diff --git a/src/images/edit-copy_1_24.png b/src/images/edit-copy_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..345b2f1d7cbc2238e895eda7f3ce236f451d12d8 GIT binary patch literal 725 zcmV;`0xJE9P)o@C8T-_3a006Dl?}?!^Gg%N(Y>yRJWM=AgI&$DQBoaw5Gfxa| zHh)H-herpGZf^eM0fZm~A~V3t^_5{65)pllfQ!XK@ZIw~`E}<@e(~uNF*8lPs6?o2 ztj>-!R$YZ#Q@XxxO_e_Y9%Oq#_zDy>AY&Hu3$mMbYD+Kmoz6C|Vj#G>P0frC~Qc7s8 zA%uWG``g7cJ0P7-2aymFY}+1KECNw~7udE9B4O+-D_Fd0Z5LW=Sau@u$S#kdYD{C*72J`o)&&(zUFlO)G2LN1NUEuKh0hq95jXVG0 z{B7HUl;#yH;UH$AF;6 z<+=F}=GKmRDjTbxy4~)B!JDgph#3rM0jg^7z2(K{fBo7&#+023nteo900000NkvXX Hu0mjfy%<3* literal 0 HcmV?d00001 diff --git a/src/images/edit-paste_1_16.png b/src/images/edit-paste_1_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b0fa070e1616e45a3a5ffbbf2a5340e13a3ab6fc GIT binary patch literal 557 zcmV+|0@D47P)lbH86?+K_76ZvcHzRmg4TirIZ5N5 znkIh$$;h%>1g=8mHi{J!SC(rO3Pgc~|jfg3+VNFvguN}Tvp;2WV+RAL2Hfa zbo$h6HjiC^X6Dj(JVqFXsMqUYW-Jy9Ff)uXU}kup2c;AM91+opqkq!N!ND0ujOYeZ2g8d0%%Pv)OzG;IEG3_`eQp1wnwrgF}c2Mx#;m?dy3}M5bHU z=$43JwOUzmT>VtNc=-Kr2LO69naly~+t=p~(K=yf(9SM~!y#(5&y{}v&utPh{m6)D vuib9{$mjFyp8Jb%_xkGc`~9!`pYHh^x`Qocq|#xV00000NkvXXu0mjf&1msD literal 0 HcmV?d00001 diff --git a/src/images/edit-paste_1_24.png b/src/images/edit-paste_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..d131b84f4a5eb3c22c2deab3abbd19ca4ba2df0d GIT binary patch literal 1015 zcmV+Mq|M$P{JJBh5P&aPl4Mx z)6W`>#x(c{n+&Y3t||b%Ho7P3TVG!nQxjNOS$VHot$yG*&P^fyjiZ!ed3l*I3{Beg zebTqJwT0t2X5Vmr&-1)bx3{-{$Rc1QsMTtpEiNwJn4O)aP$-xorKDUgTb*WUX^Bdu zLa|sh`+L3K&E4JI&wDz}n@xfsFmus)A%yYOYBj(TG`0p1!yi6McPLWqGOknHU!i0}JsZf;u1kY_tPJHJJL3nAVHj$#?e z%7U(DfbQujLWs+88O7Y|&M_UN*Thi)c;m_y-#|eHU0%{KOfUqzguYX94GtnMeYg;FCN9Vgzg@NCqG0(-!-R$|7JZ!KC2P44SK$ zF+2=`tk-as1X-2^uJ`%APY?t~VgNUke*ir|PF(||vZ0?Tp6B6t9^LLKXXj@K1hv|m z;gcudZ2(=RluTt{R1MgeUhldtolcvh<6|o23iI>V0m0+P-)ua1u)YQOF$rv5M&l&V zar*r}=jZ4A^5TehZ`~pc1KRBlUp@Nb+lS4KPXJF1t1{IEHZ_n}aGLC3FyOCOuPB$x z2K>?2Uw;3vxp5D8ts*Tkkp$!VS}8>k1h}qCuXo1${B_#x4r?E;(b{g^NrJ}+jA}#M z8qjM!uaA}VP4^*VR&zR%v? za~#L%WPzIv;|5T@xVZRJjj=%xs=v=(s~5i>|Gu_%{~j>Q@b6#Vu=;Z0b000McNliru+zAR75+@H5gscDn1RP03 zK~z}7tyfKp97Py@YG(E;Gn=@&i%PPq1EL;+M=v=Do-zcFiv&;p0TmX(4-`BpNCbmk z0|9S(4J+y~g6JXZ!C@AXU82MtgVCLj-RbG7dLIwnRoy+?Ju|zppqQeor=I8ic;0$j zk;F8k-EQAkO09?p(vu`e{!y>j*KmSSnfAr4t*svbTrSwYS+Cbmf)6!~2VT1JJpq7X z0RW^VoAH_?Zoc!1Ix&G4-@ATk?#yHFmS*QKC{;?%r{L??UVydMyWOovpS}Lo&nVB% zNB^@HVl_zqXb1g|Z(V)!#@G-ntepMit*3kE7Zxfgl}dh!0M%-BDr-Kw^e<|)8fIo@ z{QtY%?u8G239bORF)0Vme}4B&W|P(;Jm}#1+P$d=yz$K~%$zz6i9-bn#2B1@>iOp; zCZXlBIKN-DaEmXM-S__bvUpX6r$9p6J3Oc*LL8+J1 z#u9*#WF^TZ8yzl$SREZAQG%U%d<_x~qj#+J@4Eb<(I5#40}l!^CLyrFApkt-@-8ND zUnv!42^a&4i4RGv6cgg7k1pe(#)(T?L37p_A|vZ!6;KkZT?}2!V^8D} zNLzly3lqRI1jLxgQWyJJ1t5J03JDa2;W&4JcQpwyIw9gbGKN4A@H9jc0y>OUU^Bo@ zb{PVrWKIB_>w&m-XS5xyjTi7Z@Q3q&B$aC_6^sEd0?vD$NK||Mfu1 z3mFv{eT2X`@I2rmGAR#)xhgd)Fmn~=5YR{N z0=H(W5FHoXbxdvz0HVsCM`eVjuY$fWa2^@g*X4jaV68QbF}{5RfPs}i0dxUK>NeE5 z6_Cb&Ru_U5fm>@41Ob8|!2W&*y?zf03QJ3m*zN7@0Kh&;IpP7|(ZmuQjo+j}5+Z`Z zV1Rae4?DZNs8wrNT|Eatq19@=-)Jr z(o*`*k?gdugrarQBTk`fk}$?#Fc_fQ?O}EGoCDu!G#ZbNf@ecuG#Fn-=`gtF@;LDi zf*~k^a;c1Fvw3@CW8)bB9p=c%6Bz#bUAq^CPvjMk==a)GdEmmZyu6H7tM&H!`ueAp zN~O&rEyrKCV<&*cgM)*=IAMgw@}J%z@7&$Jx4F4V01NK(uV_y7ajK$^#T5XHaZ4~Z h5^<5)2cS6t;6F9x?hdVS9jX8T002ovPDHLkV1ik@2gU#Z literal 0 HcmV?d00001 diff --git a/src/images/edit.png b/src/images/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..083b97ca06c414781fbc0c2cb6c7bf75afcb8bfb GIT binary patch literal 661 zcmV;G0&4w z>mLfOf*x#cK?G6a(SvvptcNIV4YobB9t{3ccC*XQHXRT9n+=FQcr$Mv^Sx3iOFg|Z{Het^Yiz&rg-{(IFeex%Bsuz`DROA%Rmt| zMq&jqbG6b*KO7GoNWJoTJv=5`&mp>TqEXAhRwy{R8K6+rHE`$l;l1&9ey-kw&bC3E z7``I>$a?o#MPy7%f$5ZnO@R2_>qlC`V%-kJR&tKo(9muqS*(sB0{EuwyT0>Qvr$WXxGxtVq1V~L2vLp zdPc662g3c?2F}sSvMQLxVgw){Sor#dOGXZDe!1ZzlA)96&t!g`+SBuNZ9P+JWY>)((?I1zV_AfT_~#jRa)L{g00000NkvXXu0mjf4X7qP literal 0 HcmV?d00001 diff --git a/src/images/edit_control_24.png b/src/images/edit_control_24.png new file mode 100644 index 0000000000000000000000000000000000000000..c2af0481bead4eb958288335d88f2b8bbf19545c GIT binary patch literal 1090 zcmV-I1ikx-P)4aU1J6lB zK~zY`#g=VsQ)Lv#|M&Lx_TFyo*0mdLVS|2<$Oy|6VuG+?*n)&fK&3drkfK25TqMTC zWYNT+q$YF58fHYJV2sM71UE-WM`ki*uo!FRHejr4mMwefy59A+cYW_|uOG+^WG{4N z#`F2)|2xn5pYuEq@E-@UQbM;6?Wv3l%^`bhlQb`-)`vjYgVN4{m;Mn(v)Le?B+SWR9^a6xNh=ab5vRUo;P%CdlQKU(T~C1bs#wHg4*~$7TerPA696rYs^5D2$E~>v zpXT*O8h;H+P*YR*>OBHk1UuOLC0`33^8o;Ga9c_B!vJeXuArE?ixVF!@y9?MS=2Pn zoJ^t6sKH0}wclL4)8l(&lXHi@Kr!12+hrBH`;$Ow7H=OA@I-L|n*ZJpK2bCZAoWN9 z(cOZlwXL|~T#fT>v*3eaSSo!m?^=a1T_bV|NZ~&yn?b_cIsx zKp1sLQR2c#kbO#buG=gy$xJ^&d4z;q*VW;CPNbng+gE$#`8u^&DR{y-(Rk5?*3V_ zMfn=0_O$h9y!LWg+)z}O3`CTj1R-6GhP^Eu=kr;uR&lX?%*caiTnrpJVrf@vb*Tj8 z{*mF^#~K9hJ@s^P4DmRgoFKu<%qua`QdrIB zhd-|~Hy77~XPXvy%ZYD{bnJXMEx*sDrLB!^ZQR}}*)VPiAUL$mKmK=g5v%pAMO|{rXkacAERP$2URYwaS$rA|0{}Cgw2e=yh!Ec%z_nO{wc~ zL%^#fMb$O0U%%dXDdqQqef#EVIG@o#kT@LK hv9;yK4v9JjhU^KAhVz3?Rs%iE;OXk;vd$@?2>=MofW`m- literal 0 HcmV?d00001 diff --git a/src/images/edit_control_3_24.png b/src/images/edit_control_3_24.png new file mode 100644 index 0000000000000000000000000000000000000000..42ed53d746677216f6b3f64c8e2be55b95ad6b3f GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE(~!D6B$geFx@c(if|Tq zL>4nJa0`PlBg3pYAU*6Qp1!W^cbR1w6!^Z*j!Xjzz4LT&4DmRgoFKu<%qua`vQXIf zfAHZ8u0NMQe70$UH`j{S_KS{u;5XMl)!Np^wl;2Wm24Qd1Q5hb;eB%9=sDfm!wDj~ zP8XU?&Gi?3nAuTyb?4H2iC3>*O9G{wH}%iRkUiOao++rgGle^$&~c4x3cKJ&u|OI2 zmLPF%&BWOF`2MMCx7ojb{pup=w2ig5x7TI&lnidWJ9{*?r`>jHt8R)8)KQFZ$%#I( z0m%PTxIyE;NpeO;hComK)Q4Kl+qQj+a@x12>T8w(b2C$ATuw&DkNX!ce2^Chs#&n7 o<9I5gVcTYbY|f2^hJP3s@)mZeJ)Ryo3FvbMPgg&ebxsLQ0I(>8MgRZ+ literal 0 HcmV?d00001 diff --git a/src/images/edit_cursor.png b/src/images/edit_cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..21070fb642c090598c38347c044dcc7091118d22 GIT binary patch literal 5797 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 TfS!>d00000NkvXXu0mjf6bU^J literal 0 HcmV?d00001 diff --git a/src/images/edit_layout_2_24.png b/src/images/edit_layout_2_24.png new file mode 100644 index 0000000000000000000000000000000000000000..23818d3ea0708af07dab71ebda12f2fc215dc129 GIT binary patch literal 1190 zcmV;X1X=ruP)D8Zr(?P75Gz zzgfO$O`bB+)=W!F%TMj??RXch9v6AQ-^`3^mw#^gXCy98!G8QK%FJ1W_Pj@+>m04E zt*09s8<)#@=}31BK-cxU+di8j<=MbMkcF;y=LfPuwq5O~cQ}RB=0`hxU^KxLfa-vwcm7SDw-6G1hU-co+cFFeVSk4iE6+oS*5q zIhE~uTd*vX)eE9*Tm@mVa-?H$F&Rh6XbFXw93T_#D%!FpML6MR_kl|c#xu;B9%uLZ z1cT~IF2*((3d2Zp;V=a~Y5h8n&yJJ{n}aQH{>J6bo77b3__oC`-A~Y=uf?WhjASwi z(j);xflk)1^5PUaO}qVE>AJ==kHO&`5$wgaw8xrArYwXIW+s!lXNkuFtVkb?>Pe<( z1H5(cBIhsk;nF1bHH9eiR&ge<8B20wng%wTEqV9%a!){3k5d^uLS<=~{h$28u~Xd) zXJp>l7-HT-PJZawKvwo5RDrJRXqq-$Ft99J;{Zc}4(!faKL7Fz2fq%11aCKmSUO+k z$L;mW2?)Dg>}BO9tF|fQ%l-p?N5&ev0~98!s)3^TN^;-~X|QuIOX9 z+%6=$6L(cD0ES`Y^vOh=R5C#-naFP#V;|H+m{_ofaz`&ao_F!+^cbi9dYXP~6*Fde zQB((_qykeb%?n~021YtP;d#jcjAVjLsFSGGgJBrh+>g+n+(blC@zhjfQ&ogR!z%J% zWHVz+fg%Li^u*hd1DM@yd~oPHUS9VkQ>QOsP*&M=k|b{W zn+x~U+tqOwm-KAi`l_q6)T0QSNYz!9-H;?{=z5_4^@fIqqq#&(Q&tqkl4aRaRrRVQ zNgL|x>%W=+-aEGG+bzpl2b2M4Wmz8ik3SJEATegnzgoPWR2JC;r2qf`07*qoM6N<$ Eg4YEkmH+?% literal 0 HcmV?d00001 diff --git a/src/images/edit_layout_3_24.png b/src/images/edit_layout_3_24.png new file mode 100644 index 0000000000000000000000000000000000000000..b000f6f0a7f79b17a32de9a65cc4144bf4e05def GIT binary patch literal 608 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 literal 0 HcmV?d00001 diff --git a/src/images/field.png b/src/images/field.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb6ea617499cbbd042c219f1a6180393981d10d GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEEwh30tQ9~1_mnUjeh(0J=>YNTp}_-hO?G$$C2)C z`+y%ej>N_MId}jBTvm!}m^HB8_1y7e$B_qYXFP2=#qX4tnl_i!Dt8@P-TRft@7BVC zx>GsDcjA7W{xG{l|IO}QQkn@766?&aC2P2aH77D``rPsH(57VDkUrLu=e)A|0dr<* clrk_gG{1HVSXgQs0(2RJr>mdKI;Vst0A7z}6#xJL literal 0 HcmV?d00001 diff --git a/src/images/first2.png b/src/images/first2.png new file mode 100644 index 0000000000000000000000000000000000000000..082aecd842d5ac38cae69e2d24c17a2c608eb685 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHj?5lZcMUuZv7|K%rfpE{-7H7bFn`D2OE)i|slC~gyR literal 0 HcmV?d00001 diff --git a/src/images/folder.png b/src/images/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..084c9da7f3ff8b6f16e48f260e14602cc4e7fa6c GIT binary patch literal 1176 zcmV;J1ZVq+P)WdKBPATlu^PH%P~GB7YQATcpIG&MRjH6SZ6F)%Q)s|A<<000McNliru z(*p(wF$s$&4}$;z010qNS#tmY3labT3lag+-G2N4000DMK}|sb0I`n?{9y$E00Zzz zL_t(|+TB%MY*a-Q{^s8Ox$IAOTZ+O~2t*<=A_)O(V&V&hpizP$@r{HxUwM#_sEP3b zW7Nb46Jt#DNia>s2c_1u#)ME}SZoYnBWqhI?Y0QJTejQXy?cLWJTv#g*0vZDo^+CL z=bXJW=ljl?Gxq}j^}!xx^X%~67j9giI~PmlH12y4KERm<$Gi*IZk>4X_~b{Ar0()( zu@9Qnf>>>wd6WGj*F+w)S&Z&JTAUbrnsYnpxxx@YhD5G$eHd{gm36scRI1LFM0Ojk zE)%%i74BY-Y;MPMz?BCR%uW@K+gbCkmA`)9mz8kKwXbK2dB@kk+`@+XP@vWr9ZWJhh1>u?S z98xBTh*{9M1;$)xno!S;$6rF!=%U@e62qBj6O4Yo>9kWXZ%%h_$mvFQ!*5@|8n;M< z@FywoO+?}bv=l=^i;{NAT+lWiqgX`7NwqIfyL$#?_2YJb^0eNR@ib4DvDH4C3g|_Ciwk9!Ry* zM2x!1ygeEaU>QO0>tB2~mH*ia2U^xk?_vjqxveBhMI_AMDjnbJcBakE0wdKsjxgS;c z2ua|UNd3Lw;p{CT@fzxY)uGenLzG%L;$Zs91uT>+g%vls_qF%GA3k-&-gaP5TnL## zIS3}a0Ne|DUjk(7x{}CiE+(#3F+1I$?#^CHq&fz+@9gUb`u|D5)*o6Nd^bCS=B<75 z-43@L)K@yp4?0Yzz|2FfXkp@yMa&gZ)gqlknYForz9SzFv5f~SsyQ&V`nxEZ?mAn# ze03kwDFZ&QZmA0DIw=0xz|52l+wLwfmOPtSw`=gwd*6;Qmi1N8V+U8f*H(PdY8T&l zW^(M)vFd_A-~K4BU2Wj6B5cQ7cRroz9N4k<=noywzI`1JIad8-j(qY|{!XdfV>!{G qbXU*d_WdV^pWO9w{b7UtzsBFMl1g$(l9{&v00005z@&^Z{Gfvdn16EMgOU{ zkL?zPe6nNi(Cf3$0N5Gu&Sd5I#RY#qF*1RqG=N;Fxl0*N_jHMyv_ZO5)%yzhBn2^2pJFyA3f?u0YBK9H+CQTg3r@nE@bye*)A4gKkg60>l8g zQ;Zl0B%#|Ah*-ke0B;MpaxLtC`rY3=X2#08fz$+PtdJ%v5N&8eI0zKuj-eE?X%Rz3 z+pG%!51v{YU2B-)-h6UTHZ6u;J-y=jp@P(a)P$5Pu&c{KDv^imtd)h7^Ji>;7$5Z!<(ZCh1o z>ol7dSgI(vVhaEO2K%yOA5T}oY=eBYy{K%v36%MizH3;?dM{l3;PxG>+skIOAhI+*RwWG4>YRXp>_R=^_% zvbEcWf0(}BG=~}Otkp)}12#)y;Br~w{9FsAQu(^$dQ*M9xrz6lEleG`b5{ibE&F3o8s~m);+Nn3kV#$0_jFIZ^l0xFFFcfA1b}$}#gqTymwE7wD>JLB ts|8lgsbp^N4nJa0`PlBg3pY5H=O_Pfk7LdLwSk|RxlLT@}>978NlADy(nI%^h#IF5k^9<#Jid^v5E(xyLyU3%YzNSQ4E+ v=aim{3Zt*T$@hekq9(ov$^Vb;UnAcmUEE>6c>N8azZpDT{an^LB{Ts5k|T|$ literal 0 HcmV?d00001 diff --git a/src/images/function.png b/src/images/function.png new file mode 100644 index 0000000000000000000000000000000000000000..65186bdae21a072254250a76392c9debcb5942e8 GIT binary patch literal 526 zcmV+p0`dKcP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DMML_t(I%k7adOIvXi#eetz zl9y%+ZxLK7j-`Vjgz*0W9n>X5C18hAL|gho)Fu4{E*(O62DDSjWD=aTbnO(g6bGG! z+9A|H=upxc@qasL(qi5xC_T&Nau4U8b1(cGDDLO-VapD}X6`XS*s!Z%)9%J`!x6xt(uqb$-2W+9+vw1H3ZP)3yMND#D^%yCVP`C5*fUw|(v0 z#>j=c86K&y@F&7wP-KdJzXuQ%+UFprh@9*eI$uVdMDP10%2cd?C|%72)3?X9vw}Vn zm<#LKnemcLFpWqzRsi@wDzS8T;_3}rc8;>7z3P~eN-U}B;ceoHm)co8{dmjcRsjVDe@E-vD27@w%@kK$! Q+W-In07*qoM6N<$f>Tr9egFUf literal 0 HcmV?d00001 diff --git a/src/images/function2.png b/src/images/function2.png new file mode 100644 index 0000000000000000000000000000000000000000..f346cc21a8c68beb91b5080110fffc602c46aa90 GIT binary patch literal 515 zcmV+e0{s1nP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C=BL_t(I%k7grNLyhPhM)7@ zD@KXYf}^9FsnW%to53y_L>yeq4O;iASDnP!Ma0pVj9m&Lx#Hp^4kDB$f-WwC7ALz{ zgi`#eVDcRY$#g+?@hoR~-}gN5a^QUgAPBu}koL_?B|TFd{OG#odoEM`^pY_MQztdc zr28Br9x+X2t;v`CQf zG|-3Re6tVg7p4y{YE};KG`zxR|5}?Y>hu)S1z-)PF40Hs` z0>Z?6m>O;95?zV7!k;LC$a%99>kf)u(lKV$)^#}NS8}NRjIb6Iy(B;^VUnm`N~E4G zZ$+)#<^9U~i#3*0OCs7CA*j_Q6r-6}YZS89YUvI9!V{i5fsB05g6seQ002ovPDHLk FV1m68+$#V8 literal 0 HcmV?d00001 diff --git a/src/images/function3.png b/src/images/function3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6371b9e9e861019b456f64e5455a8c4e3ad1152 GIT binary patch literal 505 zcmV zlRiZdL^ulzIVHt)a-|ux*#R4M69`U>z5%$@{RQTfjt^Yw_CtLQxavpHEDSgc1DgS+U7Ed8S`CN#dtkRra0`47I0v@D zXD-ctC>>9A)nw;Nt0wRiSnpkaB1W#o$X?-_wv<+Xdf0nU*EfC`d`)RJa_1v4GA~BF v7+Jb+^U6yViIFxi4b*L78xMBlW9|G8LWh5tVRTEQ00000NkvXXu0mjfil)j> literal 0 HcmV?d00001 diff --git a/src/images/go-next.png b/src/images/go-next.png new file mode 100644 index 0000000000000000000000000000000000000000..da01accd2c2aac9b1c6b05fb11ff67fe35c34d4b GIT binary patch literal 2048 zcmV+b2>aU;f^B^r*^VuZ zKGtV6qv^gZdV18;{aTulH14Wb@AmJ$bM8I&z1K5TRaEjIc~n(DtdxJLlw<$kz4!gi zG&Vn4DgPBGkZ9?ePj+^{X6lOFdzzw$QgAWTyxC(%T>napLQizB4G$DEFH%D&# zzV989J*qlac6`EH3E5Wj-Reia^QS~h7eD~6>pchsG~WPFz3bk&f>5aD9jfbHR9BM? zO>*?u7p1m30aw+NQobhUGC8D{v&h{^;rj3TFQvyX_p0hbIRqjZ0L7S{ZFuVICt(C| z@&h{RNx%i*x?ZmeICrwiZ{21p2T&u4bB>&z=(s%d-h0?DdP5Fkk@M9Yt~Cm2t^UZhvAuNLU)Y_r-c z90kT^(-@vjW7%ncnTyx76}_qKQJOMdR``IGmxcD&)OBIRX(FeV_MHNeB0f1(*sOr>+UGQ9)^3KA)R zH+JwQK&-LrVD+)nFFsz^+WvaE1Wd37ya}>A@Sn_QFg}-t1oT}1XjU^22A?o2l3CN? zquY-Er2mQg+uC0%od76)4HOEwMDVJ>jfE_3FJ_C1Gf`wmrDOx|+bzewQ1kH9&wXoq zTl*hu1T5z=p`%`TDmrv9&mwBqb?Sb^nweh}n zB?K`=;FTyQV*!6Bn=8mBPTyXXEk$hBFYt!e)>4kS^C$2rN>hED<2oN+h5(3Xy@GGw3>WnwrtOq^_$^^g{ z*NZP7&z>C}at2>|{_oS{V_#F%Y#6UiLLxLF@aoA3(Zyx zrpHGgRn=u1`1lNngunwXqVxUr`Ald_5U=m(J^KP?3~}d^G577C_g$JE8(nv28oLhI z3OD#=HJiy5HfGj^sSNPJ6?)yQ$JAvGaJ3sj6Pyg|5odc2-A;gdr@6-sz7>bZ$42=;Q zAw@h}jCj|KP()b2@4&Xk2lq=NPs|2>>DCQ>>-lHjPmPZBl>12;`6eb=1E9`}IV9gU zYVX+l#JB(W*&jUH5(e*QXX*A$44gajerjZBLm%~#4CK>SathZvNbVL9#(_^y-on7S zGasZzhI%&w9;p29LNvzEwmzh%ZeifuGau$7KfBQZDosGdNThJnsoNOnKmF0v@KBGc z&TMLctwI{--v}85zdSvKf&SC~o*KT|qpH)J9$+g_u5nO|Sp`3n!a(1t|4a>C=~dO# zRt!-23>bkCA~QRUfxc7!ogBK-qpFizH9$$fy_9o=enl|G2v=rP80dTE#MKL*ee^Nh`3(U@!Dvn^!72>MQJ_FBDf@2jq@ z9n35&d`LfuHZ%abKp+o14A!ra;Ofd4JNTaOrx8GP2)wS*T#Fsv3>V0# zs>Xp1OT~ox@bxf3L2)(;!3zNk+QI)8;_L`1zlg*74g&UD0`Xe6k+aQkZm2ndKG<^k z>p9CkC-2(@if5s4v93obOf39dFuTF%2f<6eN9Z||?|qHh&V$$u2)scdx@v7EBhTTQ9%>l7=`|?Kq1Kz*N775{M_8syb=cIqSVBa)D(sC z%#sWRcTeAd@J2py1_nkIPZ!4!kK=Dct;1LxIdtxQW~yTJjd@=$<9mfU=Q8^Q&E|iM zx25wI-9EWzVWSq;490iQ&&xA59DiPZPibe}{*#9*G~<_Zw=bX0&v4-9=PN5V1WsCe zUOVN^iB0|tYuSVvI9eEDrv>FseLYXk^L1lyC8LOGLCjbP0l+XkKfN-kl literal 0 HcmV?d00001 diff --git a/src/images/hlayuot_1_24.png b/src/images/hlayuot_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..12340fe85819d6e738e22c6867405408ceec0c79 GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYs>cdx@v7EBhU8VPRpOSGnt1fI^Zbt`Q~9`MJ5Nc_j?aMX8A;sVNHO znI#zt?w-B@;f;La3=E7?o-U3d9>?EKwazAFy8^9$6Q;o%fD*+;Kts-*dkfos2qF!xNJ$kv{=x(OP-p?!L?h~F{}m52BG zGuiBmE%x*DIHt~2Qgs(Q^zrGncQs1y<|ych)_I99J$aWkEL?M1dETR^)9?PS|HOYy ZzyDprrZ`y7ts(#b literal 0 HcmV?d00001 diff --git a/src/images/hlayuot_2_24.png b/src/images/hlayuot_2_24.png new file mode 100644 index 0000000000000000000000000000000000000000..c648cb2789e573eaa6bcf78c82909546291291c4 GIT binary patch literal 427 zcmV;c0aX5pP)btX%>yV~q}vzqQGAX-*e1oI+oi}f7HQl%T?kl2 z)I)5?jHC+f8d&ec8`j{?&1+W1A z0Ki-od7g6{>#`6A@w^P6DEJ}u*QXG`^D=<4Ea&H_5Hz(I!1F5OR|r5mw?A)B8)5jt z%YTyrfKs{z09lqV+qV7aSJ!n{Ns{c3ja5|<+qPdE$63d5{Ccb#hOu{DcXjf=iXWG_ VXFQ!PFRTCn002ovPDHLkV1i18utxv@ literal 0 HcmV?d00001 diff --git a/src/images/hlayuot_3_24.png b/src/images/hlayuot_3_24.png new file mode 100644 index 0000000000000000000000000000000000000000..66cf271d60dd6e442b7f83e5f80552362c717945 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=CW!K$y{KjmZq4AbW|YuPggqW?2Sl4QUnQ#S9FL)}AhoAs)w*6C_?WOl)jyRLooS zvOZ^0_a}ejN0X8h5)ur4$)7FiD|{&*Qza=OArXKK&0fIXM#oHqa%Hp>cx_8 z=G-yhvDlI?-aLEu?N!CQrzc&letT={)~KkcgE}XK)~s2h!BzkN-&&^R%?6tiB0hb4 z8(kYyl~|;)i-m=ypiNcUSpD9HXV0D;)9OoNw6?bPW44Ic@iFSa;ls{1nC$HA=CBoP z{P1Wi!}K_{DD}&M+-|xOTO0Vq7Kn(>x2rw0^26=<=PP&*Efqi7q#wWUfysm8^Ve7C z9su#z$8VHAbn3*h53k>s?-6@&>2y;J_d}-Y?|BEaE$sI87#!;qRxdLE0Yk%&|9^jf zuiUe3!-fwQ)!*Kf_E`M<)*BiT@ng}nX<;AU-Q6v}==A4LpW?Oy6)dP+&BVZvmy)}B T;_h$2kY(_6^>bP0l+XkKd%wB7 literal 0 HcmV?d00001 diff --git a/src/images/hourglass.png b/src/images/hourglass.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb94c7e481370b544a199f623fcfcad1b255f19 GIT binary patch literal 9953 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 Y1GZe?kuig0&;S4c07*qoM6N<$f)%uTAOHXW literal 0 HcmV?d00001 diff --git a/src/images/last2.png b/src/images/last2.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0145a9c29cfca461d8a35a8188770c255a4652 GIT binary patch literal 289 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 Hu0mjf{g*3z literal 0 HcmV?d00001 diff --git a/src/images/layuot_move.png b/src/images/layuot_move.png new file mode 100644 index 0000000000000000000000000000000000000000..922fe74b7a69806b92fa0d2420c0069564b1f516 GIT binary patch literal 698 zcmV;r0!96aP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00JUOL_t(Y$L*BAY8yci#((RZ zg{X-kxJ&W?5=!AzQFSg2L4^bdLR|!rzyxUdR= z+-LOyPN8;F-0A*U0;fqrzynh(GdtgWGv6-U+5cuIq5rlifTMQX-j?{;_qm)*0C>8+ zjaM$;TKx6Ffs*B6w^#&g6Sx+O;@j|y?-v(Qae&LogolqFb9nfc^Wl))=S2XlvVcNa zIRA16Km;J-fDH_ZZqnl0o2th|p@a0#;!G5h0t+lFepQc>t}}o8YVkErQm19e_rQAmY$$ z?&JG@Vgy04(da9q(TK%j5rG2uzE88cAA;(rvB-|vZENPnnz^x_=h={C!WGUs2849q3rw%UL_&EF1MYnasWDQYMq3-e^R#UcQ0&zWlw< g?vH=hclPh?7lgLJ*A_B4J^%m!07*qoM6N<$g4v!kuK)l5 literal 0 HcmV?d00001 diff --git a/src/images/layuot_select.png b/src/images/layuot_select.png new file mode 100644 index 0000000000000000000000000000000000000000..dabd5fcd9fb11abd5461bb962d911e5715152db6 GIT binary patch literal 682 zcmV;b0#*HqP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00I(8L_t(Y$L*D|P8&fGhQDQJ zFVY!VB(mh1yn$c9ic%p39s&vq@&ZH_l?y1a@(>YDV@pWBSVR$JL?1c4L8wt&X1$Zb z=VR||l7f&T%1Be}&g}fN`~Now|LvbQ1905!>SGjtb97{6vDn(#0o4dsQ4Alm5nJ2a zi(c+b0i#@G8C$P*=37PqgHgEnFalt0kuPEqafnFn4kwbw9Abqm8x?Wu=J^2PEFyvv zhZBnxTl7)fK&)d$iv>8qU@%}howB>TSBd9mRZ)|NmH-M=69EtvP`vky$758L{r&w2 zKq_a;y02~~=jsVL1Ed#jx25PGH=LHnJ_r>1%`8fd3>h%gh z>4jpFB_i1()*?11*;>R|X0utzhr=PCudbE^;)*AW0j!%BDka-Ha4UH4m;B3QLa*10 z)F%-qB@P6PmhNa)ki5$J{XPJlPAAuv`IU;m7=vn6rlugdBxY5b%_ft{gxlL&8jVIN zE>$VUQ^e#q66cmkUf7Fvn|Eht_l}FTSVi$yEMl<|ku0`&_g1S#tyaT(&)4hg`5E^c z4o;6x?(O3AWF8A4@O*QVm+dz7^>sd7Uh?hchR)$3Pd7FmJ{{9EeOp;;nx-L5)Ax@u z>ysquB}t-5lBkG0`Qrf2xtfS*?t80p>_Y%T2tPsy(-6Y<5JDI5fBl#F6WZg!ye zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00N~+L_t(Y$L&=yOB_)U{@%_! zqb|3%0Z&XM5{p<~vlfDc6e?VZ#uVaDNEKTlg+;W`!XiRC(-nvQtaN|u6JpoHX#GUvh&`2-+VK?_kjQQ&zk~(#f1gA3h<|MbBgOf znTZKNB*H5YD7?>ZA~QZ-uccuEKnb?8S!5ne_#q_#6qEp4?=}GdAptW1qUxD3EN0yl z_UZiq>mXMJE0KOQ2uPzvi4F3IviLVB002Z9H8v5%KoHyI0|<6@KO)uDh5r8AAmXr6 zWBeDApqOrAf0?CIS>NFmMN+=fQPd?CtF#m&@U1 zPY)hVO~JOW$D7}zfHat*?cq==GlPlI)^-hjeSN6aYH(c_g+c)bhliM*oyGR{2UM%o zP)TbAN@BB8=Y|X@IF5r{E(ZxFEF#$7-^bC>5k^Kv@NjYxgU(>9ArqMVO11VCP<_aC zRhlp~G=y5M*5t)v5gQvDc)7ZYYPHfzfj-wm1r;b_t;3V+I1XIb4HeW?q*5tNPfufb zco?Q>wjj_H!4FQ0LSx8*b$55ewrvy&1&B!Kqhq6(nVE@!#|V}em;QKZEic8_5~hiK zJ`W-S5#jXo6zi|n@$Ji33_8xmZ%Ny>pCpq>NhXtTZQH(QS=JlNvLum6d@@b*{)GuF z%StB_iK1m$82~U%v$wOeQ#v|2-1heN&(Xc~Hw2YRB~L`Z%H{HF06054`>B*Fd7gJy zL~a;{Q8oo>8wxcj@UVzirEl4C zTwXD6X2bx8>ci5VwKzh3vZ*U>O)nBAXjzKgL(W!AxN zIkuFYZ8`b}k{Ua+UM5`O<^h5KnxCAmW`4fA!GzEI`41yu=B*42f3MnnF1UU^7-%mdKI;Vst05e@m*Z=?k literal 0 HcmV?d00001 diff --git a/src/images/logo.png b/src/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a466bbb3b800b9687a42d038b69c42a2c62b40d3 GIT binary patch literal 18975 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 Y7vr7D{?|{j<^TWy07*qoM6N<$f~>D&PXGV_ literal 0 HcmV?d00001 diff --git a/src/images/move_back.png b/src/images/move_back.png new file mode 100644 index 0000000000000000000000000000000000000000..a9132799e58d82757aa6936723151661e2e161de GIT binary patch literal 903 zcmV;219<$2P)^@RCwB~SG{W#K@@-UW@c|iBRLSP z)2g)=7O6uZSOmnvR{w&KLQtYd@b19>z`sBXi+nUTBC)a%zp98Js6qXn7wWkDX%P_$Tl^DkCuvV5?B?^<(uht9092rAyMV`F5W&;6 z1wfNhlVgd7CM(z1HWumf)JZoL8PEavj>j**gD}TTOAa8hLm#*1=O7w_4V?g#R$j)L zvoJuw2+67_Ff?GpHlss0HK0{c=PLEw3QK@mjeV;2-fC@E6xBmkUFM>nlLkWQ~LIenf14$;i1wj2QE@?NLYnc<8m zc!@E<*G#RLK!GGTgtO<#1&M)^0MIQf25>}$WS+j82?6@@>elv?y9@AY_aJ^SiIqP` z#}MZ))`TbmuoX1$o91VlUz2Cex-JMfd|CZcjHK&-Q7B3QQ1*a>;=^dTA1%W&?(;Px zJ~fW57cm2ZwIC)(K_;pscC;K{m;{pIQSpV_Kk4b|Z%0;D2av8*h$H(8GRnp0+v{!E z-+cq7LfpP1fh^A`SYB`KF{hYoVw9`g>amrPl8)B!^V3_nbMJw7?VzZOi<2|?D>{EVO-_nAD?A7pUAxM;Ms0iE)e2rWFq3dOpekW+(A& zVw?bYL*6scMF1($DDl5EF{J>whYN$@&*Q?3!ygmceVZ5;0Ba8qc5d9?xEgUO%`uRs zQ$q-r&d8~om@)u|FCN{zP2cCr6BX#C_15+@O^gdbpXL{uKOBXynN|t^CZ-&~An9Ct zlimrZX=2j#-U^~n{6*>XtnUkLzu(^}wlDR@EX}!G6H|9E%lqtVUjUlsX_kQJdX~*0 d>+P=q0|4MkW7s%_N2dS)002ovPDHLkV1mPdoMZq1 literal 0 HcmV?d00001 diff --git a/src/images/move_top_1.png b/src/images/move_top_1.png new file mode 100644 index 0000000000000000000000000000000000000000..aefcb7941e6c5ac07cd9a2215e3155d66253141c GIT binary patch literal 846 zcmV-U1F`&xP)HZy%@!lB6x^+P=joUJ6#@TXEKxQ$IR|pm#&$itN!z^kFGX=TVG#)7D8A`l7zZq ztwls$v|6ppK$kIOw%u;)B+_oLDKI;Za|blDKYzdV0b@+%&8o_o)2ARL08LLYysyuzp}CIO@c|G?TY~`250oe z>(%8$c~S!4BA12W($l-k%{qS~79?cU6j%bhgDdx*F99(I14gw*5=IU! zY;a9|*|0Kgc7G0^aK3Jgf$xcAk{(2AiM zrJsZLt8K9L$w{1dwh92%-JhFR??1no1T9gPwbNh(N3BcDFW{4Re&OIy)DOV!n@87g z0w)JID*VF-t1oZezQf+$-l4emk>kKZ7T!?+I>1-p`;b|GPLaMtOofwSB!F&ja@`qq zCmdw7>YZ}PSx~9Ge#dcqY}^ZNr_R<-WW>_g;rKucpBd&T{WL zzjMxa2s^R?jNm`Y<#NW-;=om$$+5F-v+I{ z1QqjIs`d1KVSVj$7l1Gdq3aAnh!_w>k+6R*YfT!1)Bt9r;Tu_a<|y>?AF_UZx)uYH zmIcNbq?C|S0sw>%Qq^mWU3rUxnL$u81B@L9E`{Llo}pQ<4aWeY9Xm|Z1Y-;Uz!=lK zful0{cv@>q0^N86`ml)3#tLM}(7Jf{ySCqP&N*Dyh3mTTeV_dvzZ^vvgzz*#5@bk_ z0ik*9T%*XX7u_qIZnxX3M1)qW1tCNXG)+@(6~6}QFRv12v%-YZ(V93TKl<4Vb2o3T z#DMMX?N!UNz&Y;$bmcgX&pl6Nvsry~WQ19kH3Xm@dyq<{008ZF8(|ps0d!qA4`ebJ zvTbPE-sbxLM9Z>}NF;jRG);@Iv@;py2oU2NuBJ=tDL)*6dJnK$w0!a2*zb6Tx1wifp Z_zMd8ChUjVhi(7>002ovPDHLkV1o2$HLm~w literal 0 HcmV?d00001 diff --git a/src/images/new_1_24.png b/src/images/new_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..efa2da7fb5ab7bcd5939d4ca8c84c67e48ead3cd GIT binary patch literal 1026 zcmV+d1pWJoP)&MCOzA`eI%w@ecUt&SfT{!|$5ZK}8(KhrNFh2n$ z6||M#^+@#C4+{&6S6OXhp-@1%T!vB#p63O;R4Vz0{=UML?LvACN)Q+{=(-Li3CbrZ z351r@iFn+6XRl)-f@zxIoWpUPx^AUXzP53P=X&2m=-D?Qgpcr%6!b^}+h?Ysqyn5W zLO*{F&3bquAjR&qDza!=knDMoLW2>FA$GVQ1VBaO(7Az*-a$YqsFIB*KEV@G1;AA- z5rMIQN??pJ+Z>XIZd}srrAvS$c&EmZIQc&E-=BeU6r><{@d5ROT5krkYdU6(1-!MT zMbGt~5pFY< z=OVmkUV=6Bs#-3$O`Jb>?k51)-wFVE%R(p=f?*ioy#DJhm&?!?GrCj5{9*fmZQHie zHC^xS?$QT4I<(xSgz&tTxw*OP zjlq>}IOk|@Z*SVM<2YDbTLb4D(P$L;eEy%AnVGZG)6*Lb!PU#Vu8Ymh&4%DaA^{-; z^7%Z5hli2PW^?oN^COd!lXq+50$|IsU>F88O@m<=P33SL7m-K=>+9=}78VxX9UB{4 zIv7*8Zb~WmzK?J?+*Arcfpfl^PNzpECMH%I#Z|$+ZQFM?Ha32(uG>Cj-=vf%7K@EKT3cH$3Sx>qsCX+a9z2QQK?|P5i%|an1qDG5 zy@*h+UPK9!qc!M73JPtLVj5#3v1*zh-O0}GY<9;(He}mW(FYGchBx1P-}hz+08Gz~ zea64Vi&ytnZaWX87I=AgIq|ofGk34&8-tU?)dCHZ+iA4ZYGb>}f=zP2gFxlf zP6dopFoQzX+t@K_i{#l335-)bOg%oDTu;V5#AAhBfm*!pO!~^{%ek;W*sx_>b*P%y zMNmg>YrXG$JRaB=3`ynkcF#sR+kgG(Z2rl$`PYwbJx_d0f0zUS0bn8d;N&g|3QVg3 zg=#|6I0zw-y1Kf0M-L3#n7=uxa*E->(Nv@-l8HrQD;*v%ox-#lfFPt)q7Xtr2m!z) ziI8<9^Cc}aPSNd`e|fvTfn$Qde)u14|9@q{K7*{Yeel`=*Jd2s^YBd_{u~c0}vG|iHtmbCA0;d0A z0%j;pAb<-)r`Cq|_kUkpUK&zswUA3SrNrAe$IXWEX=Hey3?cTApx5mUH;0S`!`qi8 z&Mh^I3AU84-3Zg>Ae?S~cE4ImC1)By!Z_=Ac?z!jOL1MrpC zu4Zf1;T|x+xuu2GC&0X&OFadMb^%)QV&xT&zC0uri7{a%$R^K|O=lSzv;dgPr;EU) z_K{2v;A?q}QzvKHJ2K49&Mu#v54?Z&j(ZpH@;JYoT-o?c$IAVe*TN%6)g%ZM^@c~Y zDG@>-q7i~|pX-Y^kjmr8;TguqCYekeqVFAOqcH|5l{&^4j4=cTwsncE$`-!%h{yL} zSwp=58Awh{%%W95#i>%SHxMF%?`vdKQgwHbO5$sY(z3sUnZz;Nip%)uLDs)-;y6`= z5cozTyUBP+<@Et*kHLW`$M?-rD*t41bc!F_B^;+ppf$dhEr9OEN;m~20YmoaS;V^G z?YCvdMh@WAtJKOazq|&%@&EyXeh!*#dXqEB3|CHHCOI(8luD4arg{ExiH*%-_kr~| zkV=OB$LR2WE@bRh=s>Npi|aN*^M?W2`_oxhre&JA6(erNLi2|J4;F70`482$y(GYI X5miuU5v_WS00000NkvXXu0mjfYwH?7 literal 0 HcmV?d00001 diff --git a/src/images/next.png b/src/images/next.png new file mode 100644 index 0000000000000000000000000000000000000000..f88c8814e7c5880e1aa338322f384be7c89fe579 GIT binary patch literal 1923 zcmV-}2YmR6P)tb4yss%0Byf{{Ow!-h1tH#2CYSS=74?V7~I6Ct!y& zBI0&+bv;>ESG(d}!ZWLAt#xnj@q3LiCxbFOt4;aRrAyZS{NRDE%Z#lcdG@*AC3}01 zw*Yww08mp?bJ;)@Bd+VtC@c9I@I0@i1}F1mk%t5{MO%Ud5wAb~KdX8K;CGO27%CCb>oa}PTn-9u$8KbTxn zZDx1D%W@7>cC4bWs-4HXyYZ6A1syxm0yU1p)pLJot@u>BE+4u1W{w?tnnOSS0r%W< zHzI|(WtBbq97htE&HoCKmRJP{EUvC#-KRgtZx8>J)z2K^YhT$quWp&1dK6rR}6^Y8So5TxBLp+k9~n}KY4&Zzw(#J{!tR?LZ{DN zVB83A4h_-w+CK~7J52^oodW96AuJnKwsCCiv)uXcW9;4WAZ;sFrfr^{+8Xy34r;};x$v4219^{MxDG*r{kSdDF4^CK`#1T^3ov!J@Nv5MLapW(n? z|IJfBJ6IH?NCH#aA&4jpf-Zq}w$vgw-Oj$FJv@Kx#f95O2ZrN}X<=~WV#We~DL!O~ z(7CvgS2t{7+Y|eVJC$^+zp3_~w~N-bHPrwi4c+NbtYOB!<-fA6VI72wOZ=XEJAmF;ithJ=5w;rj2Dmp*N67 z0(GvULVGkSAIAb8jjyA6r6q(yBnnij)*p`(`{S?Jeec)#;QLlYMy-(qT5D6$XmhL_ z*AmJj!rS?XPFzBI53%R2t!%pKhJyMOcM@Adxik0c z$1~+dYdRaNa2+Ra-$();!o~D9>XyI)@4WUZ4gcxqtB>p=Sysig%WK4i9*SH8<7Wmr z|H{k7Aq46=-cPJ`>5TG`p#jX_UgqvczBi{x6bc|v?L94?oSfzPyEX*R7rR*pURZ)&)g{ zv-M9MfP&GQlfOC0?H|6LO&dRs@B5McXA9(@kZp8$lrb~+t#fGf5{{kPz5agq8QSX` zSiAW)P7F^(_BC2_Rc$%3in6?IA_@2ilPdo{4CJ+tF@}UF90db^=%H*R&K>uEcgA@6 z;~gKv0$%E~!G%+@@=Dr8Fv#3IWob2IaS#vFxWfPB&A|e^UmStgC3fs0bnkq}}IzbRO@B2U?fm;ON0^rGHl4LTK z2Kk^qu!b=vGwT6J$8j>i9mmFXUF`HH#A$96Avp;obNqw|gZF(u13HmRkW3^}&xvG) zNZ2X?sDOauI3cz1eHUMA9NWoQI3OA(5e~ES5lEap`&R#^TR)ZakA^Wu(laVrYYEbn z8Zkzzpgd@2Oz?wEj0lK`5fP)5%A|pcD5I378iXlG0Wz@i9bkqDCslTumr0RaDO@7{mfRXuMBi}C#>vJGpesHn_f?#-9Fyl}qC-=uZ&o}X6iFmgKQ zz^h{TAdMxbA;{~4!Hn;JC7(D2UKWfvzM7|jFM?-=^vOSQk57b`9dI>@zJ4R?+5ZdN Yv2RT-OgzAS7wBdNPgg&ebxsLQ0AW9D4*&oF literal 0 HcmV?d00001 diff --git a/src/images/next2.png b/src/images/next2.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2a52c8ac2c75857a6ac4ee10c17cb1eadeb9ce GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHjRoKMR*GZ(d9bP-vy6i(`nz>Ewh3rW58J`x9R!wb@Ls zQjKX=qSX2aMlGEl?IjP5S_IpBPdwmaW_H$KW^UF5(vm>>+~qar+T{DWofew3 zDfW1n#XAOd@Gp=!!wbASTwBrtSD2T~OZ&UmD@Wm6)1^r~ zJUsg(8a-T0{1Orp0^F|mBr^0(sc3C%Oq2pzBDO0nC`c*nY{*F;5oU%x3oH+GCH$`h PI-0@L)z4*}Q$iB}+Vou} literal 0 HcmV?d00001 diff --git a/src/images/noLines.png b/src/images/noLines.png new file mode 100644 index 0000000000000000000000000000000000000000..9d41db0117e706e8f2e59cbdc1b902340ffdafc1 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy2cEgHXSc6;LSL)5S5w;&gJt0=5mNrgxLGvv#%1 znB8G8(y{fNxH>c>L{d^hLSn{=(#9nV4&?1%Oks*+Tg6z!#PTdxt<8~f#lzO~%l#8WtO`EP4yHg2B_(&t;ucLK6TxXFOT} literal 0 HcmV?d00001 diff --git a/src/images/noLines1.png b/src/images/noLines1.png new file mode 100644 index 0000000000000000000000000000000000000000..264044ef8b7382d159eb18bc41587ff8eadca2e2 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy7OGn(!%uBS4{WPZ!4!i_^&o3)oiJWp7;mYt2!) zq8kOwCpLUhab2f(BmcmO13=)ij(f*Xi?YMK3c??Z0(d6~D;VS(8}e{D@aosd73jZN pc!gWYL-MJLj?afwwN*Ri7~=lge<}XN`5tHmgQu&X%Q~loCIBKcK;{4d literal 0 HcmV?d00001 diff --git a/src/images/paste.png b/src/images/paste.png new file mode 100644 index 0000000000000000000000000000000000000000..35141308932062b28f6a7297d2b32ac188af32dc GIT binary patch literal 773 zcmV+g1N!`lP)010qNS#tmY3ljhU3ljkVnw%H_000McNliru-2)sHED2=U?*IS*0+LBY zK~y-)byH19R8bf`_q~~MnsLT#w7|p^{~INuMOai=ErJ>oS_G~mXc=KRSi8W2APU?D zwW*a0`wv6Rh@e6uM@!8{h-q|wnsI*Ky!Y%n6=iGA{HcU^@-wj|8 zo9D*pQ0No38Fj*F=&4_{RY3OGovMm?Z$GwzI%`f_~}<_#gy9asmm${JZqL*IlU*XfqfLscgbY zBp*D#^J92j0fZ?bI6#~rgoMlK(H{@Ke+Iy@d?ud6S-qs(nwxOwoJU3Hi$Q`>9+AWeegfDjUr0|X!(`{inDXmr)r)wpBv zl>7DX7qv4_LgT~zBQIwbzO|RxUAX(S|BPk9q@sLbNDxWnjSO_%L?rT$Km_kjukCws z`taw_$8t}Fdtp~q%D}k01Gsa40B9V-9&IKZWSD+agSSu44R<#5)J?F8df%}osn5W$v?>ey0U_-ftIM9wTojTLka^?RygEwzDVMOA1u zm$hdz1xMb@m|y_g=JU+i?RJfbO0^#h08=26kzB`rIFfyNs8$U~00000NkvXXu0mjf DAuvz3 literal 0 HcmV?d00001 diff --git a/src/images/paste1.png b/src/images/paste1.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5b4bc04f19da6d47355f3c1724ac11bdbd4b76 GIT binary patch literal 727 zcmV;|0x127P)R8bVhfA77S#%40Lfv}9SQnJR3HbFxFBM4~-+7v-hMBpk4f`)7tSgRlk z3M!~wt3a|v*d|)EXcH8aQ#M^ikY6(S$yZa-}jw!9p+Rvm)Qqg z;os`%>;3SCMar8qd=BVd0JDG7u9fQ3>(cv$2%Ky#^9X1H=Gp=VM|( z=hma?7O?_k27q;yVlWpo1RPk*f|JcDscqctM- z*0UQQ@60H`gchSgv|x-SSyLN4zVfPLp%;(jwtU{!va_pt!LJ>-IdnY+pp{^aLH=LF7}^iBA8%(vY8VdC)wS$ zhoy;>I(BvYP~2Ox!E?N}7=R50tHBtH)gZt~rO4W*)igF`DE%7e?z`LMhx0thy=eb7 zoF^Vj&~yJx=mO|aq8yZ9ltsi6Xdk6Q3WYL=u&izw&jj6lR&1TgAAr&ZD!k+qP}W%jJ@CJRS#CRRM9ND9TBQ-xjmkjMQ-h5{U#%r&Fla zYOo82VSMr$Ij3T=SddLTjly+Z+O#GUI#oqsWi!YTYX~Mp1c=N6n29LEN`M@2&z|S8 zz?K6UxCItq2SjA@zXAxJ_(ltgM1XRn1uCLIxCJIj9r$!Vb_lQ|29qtzg5l3_{kb(5 zjm9I~{uX%RpAOcb`;j_K(Y$)So_lkBnZvay{frS1X+EDb*~^{h3eETC3$-v9491ub zaDdSvvJzC!Z}FLDhAZ7kYALA3agvM{_x2uq3_@aC(l?*XVtlmP7TaJ=wf_u#Ew6js*Gtbt~* zs{A=Gb$fB4_f;IvKO|8ZscO_8?%ufy;JXvxG_OjdY&+pl1U&!}$Ngk~f1mw+4{bE>ZVIWZeAx02><{m`o-piUJ~n`MEg^1_ShZeUJno zs915FY2jSkvW{XA78NH^L^U?rh~?!cvAj$q$q3E~hQlF5q=phefU9WZEU%n%)8I;} zXYt+hA|EH4yyE9e~!QI zhw5I7X&!|-)4asyR`yp|difVp08(fW0y5KzK^%I|pTdhth6D(sMr4x&1f&p=JNv@x zLSU`-Na~a1=K8oj1^(c(8{Y%ChyM{POM|4T{{?y55I>Ftqz(W8002ovPDHLkV1j-v Bv&#Sg literal 0 HcmV?d00001 diff --git a/src/images/paste_1_24.png b/src/images/paste_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..13450d07e145f6040d4bd08f19ae7e15169ea477 GIT binary patch literal 781 zcmV+o1M>WdP)_#k0-8xg zK~zY`wN<}QQ&AND?&~Wp{Q+VM{-y>8@JCEcI!a=?XdIXsOiUa=1``wi0oX+cCrq3i zU=;@gkwu7-*ug;(qJsgn2t@3AeLwnM@4d(2mD>7R(pU9N_vD_O?|$ER?!7<@v9P!Z z0C>H$grK3cQq-I39sRhr_B@s99sTD3%PT8Wl4!P2&~6!qG5ccv<XPpGrH@NSx4FUFbiEn!XVU=NS^(L;JcnlT_0RSQZ zO14)grNpbx_c3^0!YLE>by?Rmm&+lO$@nFjd{(40eIZB!I#eLu$uMwE12s4q2>}uu z00ZY`91CMb5<;Ap?R-9eBb&{ZeGG~gp=f#SOaK=L_c73wY;|C+0ss+VcXu}f;GGY^ zviC{ZkLm>!45-1=8FxGsE z4m_aBsfCo)b*n*tVE6!ZQ$orEi72>4I7A}b`8`Ek073+30HV6t_c4e^y@oFL7zFiz z7^~B$4#2P^w1~G^<^<8s6dm?dkT9Vc$%?_`F=$7kW+oFi;keO*r0pqcYBKR6pmbDT zG#64TZQbOiCd+aG3R9~L95;rN;{^O985Bin!ob~|5!{S1B?J<-AiIBLXU9Am^dC;f zqlyn8IW`0R>Fv9WdKHUATc>0L}hv)GB7YRATlsIGBY|eHy|r8F)%QJGeoxl000McNliru z(*hb79SMTNLH7Uv010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00GuX zL_t(|+NF}uYtvvH#-BFnucQ+quFkq0oJ>K{xswR))PpB4>O2j+^ytltf+%zs|AF0x z2qFl&4Pv?{}??fSvqo?$zt;r(Y8VrQxHO^>VvZkRHS?Pc5M9oA}=PhU4VE zI)7>IPD%QxggK72_=R$RUamJjUlW!%A<3gR?7;F*!1I8rx29~5@@Y% z!ReX260gF+G{lquKOit19WJNAbHsb6S*F0WoS~G?KosLhNdyUD0Nx)WYbS8d$U^S~ zL8Kr^W0&JHUOqpQoIX1P5jg}Pup|xXR04;G>eth3oF&-0TUOe2{@riK#w@PjDhgP@ zGIHD;YI|D48FV4AtQ#mN_*n+$EbLF@ld4yuIc=Jea z+%kR`AiLs+^`~!F$8E$sg6q0ZD%DENcCGT!NwbKEVK(qQ@1d%yZ8|H>X0sn9VE#yi z5J8sZ15MNPun;Ab1gz}1OH5IgDIJPMF)7AKG`RsCpAzn#r1VC(tQO-0_^0+@B=A_F YzvX7cn+Xm55&!@I07*qoM6N<$g1+G#=>Px# literal 0 HcmV?d00001 diff --git a/src/images/prin-preview2.png b/src/images/prin-preview2.png new file mode 100644 index 0000000000000000000000000000000000000000..bad9ab0a6a5c87581083eb2499a36bc97a482e23 GIT binary patch literal 1442 zcmV;T1zq}yP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT3m6hIC>Nvg761SRG)Y83R7l6Q zmS1RGRUXGb=iWPalF3XmV`rMA5tFob+oqVhUDslumeRsvw~NcN3;ST$Wu;1_Tej@J z6nyFm(yp?#s33z+!T%@)`>=vo+eUT+-L;8zqb6z6G@Z#Lb?(e0nYs6#d(ZJsrtAj6$IhaU4g)<8hjrn(#c2a=EOpT)Fb; z%*@Qh;lqdj2-LV!B$LVh`NF)O%jfmmZ@;BSMn<$!N-M4FuTokor2{F$$;nCQ;K74W z0FMFx+&sho8^yLGn5Ic(X_<$%_ZsUuI$Dk#Ir6uQ z7cb5a4GsNkWhCZm1f8ATkL}vEb7!qqqpz=zYlQ{ICZ@UnzOAG)8Jgk=QpqGE|NoLi zV*_`0w6E#xyeBp|I5-59Z}nxYNN)PkM}OmN+_?G3<;$1p?&?A-&A_kEzBS202tX5wM3|bMBAHB5sVp;A%F&Q$1_XvM zXl#tKTqzMO%%HU9!i5W%rl|pa+Z+I)5TG^qo<}a1Lup0trf$Mgj=-y73XLG7SjeF( z*V(gU8%k+DK6@5BVrw8+Edm3GRIAk{&+`z50SGQ#xiCr+GTY;26Zdw-$-eDJRmv6$_>aPq{^3iElY%T=_7;@3sy=5kz}y-FB_#9}c#&t+`v3(lN5 z!|~()V0`>5`uqDib?QA~nbw-!yLT@Yi%#PF(Af_xfSOwi^7%65atVNIv$J@fhh;^O zQsR^*nVrosI{F!=DG)-?*cc<9&y!BCrBo_0I5^0G0|&@vvxF*KpH62+0K)67mN@9&MHvOdMR+4U@=>~zqmv!fr za)m21(>P9%?}MNz!6W;BN!crq&1Pw9YtPTk<)apWX_}^GSqNd!+|takV=oYd0Rn*# z^|hgIxmi(3T5C)rLUSg{&o}uzG5=4_eK<7!{^@r;tFHOwuZM>}(dBYkNa>SoNnu%$ zn@uTJw&yB)OR13j^a6e2?_eoibC+g-Weec*&p*@EYLy@e*s$SVMn*ox_x&4VN9R4yn{yoJ w6TlNIX3|>Vp4)u}?nEtM25#;H#gC0|0I%|^e-UscLjV8(07*qoM6N<$f+q~T_y7O^ literal 0 HcmV?d00001 diff --git a/src/images/prin-preview_2.png b/src/images/prin-preview_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c6c63ea17604dd85bb2a6b32de1888aeb17da8a GIT binary patch literal 1453 zcmV;e1ycHnP)RJ_P%sczF~Q zygpeK6cp@(pp{beMMShJqNr7gN^7dswrNP(Vwxs#Z*xEA_%NF^8@sWI5&hsWyYtQY zpFjWaaz6NvO*C@s+Bfq8FgW{PdL<(xrz{ba4WX4t_wni1z6d}alowM_<&G|>q z<}e%WP*M)wFwmNdl;Xs(-#9$FA0v~aeRU^7z|8by!k;*54fOZZ+Svm}qT%VE?4KC~ zmPSCzh-p_bd3=PCgZt^b>`K;luR#a{&?qS>mrD$Nw~u}VsX{LZfgxg9g@{)|#8{2Y zXh1s&6tpi^Qya?P#Q<)=SBJ3==wl4md7(*$A(#%^Ltz)c4W;P}ep!^ES zObd}tP@E}aS~gls3`0N^Vi*Q)wSwbCq>>?2tE8K9bvQABVCe+HC;)9?m=?#6{6ur- zg(w-JqYwlLG$0U$foa)D<>5FE$xNT=h2!ESdv>k*1@?=Dal*6IP381X@_AnzV*xqco&Um?}CX(@k^n zmnwcPI|pPGqLMj^r7{_Dgwo^*vRXjG!nBf@sVu%zLMTc3_fgy+!uLIFJ2kJFfKDu4 z1>(t9PuF$4SxdF-$$EZ|LFBVG?U65ZGB$pkPz!=cA;XZQm7uf5CYR07R%qkn&%Z|I zdok^FJ(fMHyy9)uvvo)_4E5ks547gAuJ=6t?rYq0-LnMJ$8#k|4-C_mJCAhQ#xMlM zVg)ZO;z$R}>tS_A2R0$1GR)Q2_K5^Jd9*?nc)nn&=v9E#++b7ul`h!f)u_(}O-iylL!k0hQ zcgWUegD|RKy1vE_HDRRx@ow!o~_$2s7*imIz| zJ-s3mPBOiko9=j#_uhV}j)WT|=)CC8GpS^199P9T;Q0#2Q!6%RnduI$-?oFj?>sU` z!jFEVd5xS)(xg>O!Z6a5DhfaNs{%@cA(ltN&USIl&Cm1A-shN_@#whlDm-6e)F!7= zMG;1|DscT+j`{Y+?k`qE4K25#QCv~D63-X4n<~DB;xY_l1zcbAZ<>UEk!Jr~y1uE5G*Qeid*Iy1dn{!=j z)^YodIr=u|mqnoW>lt=`(9g;7Lwxz8S6=A%ykM6AY@ns~oU_Ys8y&m*rsicIK5IYk zo8hhZOMJhl=Yj<;A1Io&AEy>>+<1vy?%SNt{nH%i+nlHGXOHh;d`T10N+zY!l$Sh` zoh>PsYl~t1e+jH)2o}R?IFzQ$%FdT}92#5+0x6T7jeLIs&49(8vQ~p^00000NkvXX Hu0mjf{>Q9? literal 0 HcmV?d00001 diff --git a/src/images/prin-preview_3.png b/src/images/prin-preview_3.png new file mode 100644 index 0000000000000000000000000000000000000000..370f69503a62f93aed62f301ef9116e4e5842c79 GIT binary patch literal 1518 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

lrtextitemeditor.h
+ + + + pbOk + pbCancel + + + + + + diff --git a/src/lraboutdialog.cpp b/src/lraboutdialog.cpp new file mode 100644 index 0000000..cd7fc6c --- /dev/null +++ b/src/lraboutdialog.cpp @@ -0,0 +1,44 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lraboutdialog.h" +#include "ui_lraboutdialog.h" + +AboutDialog::AboutDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AboutDialog) +{ + ui->setupUi(this); + ui->lblVersion->setText(QString("Version %1").arg(LIMEREPORT_VERSION_STR)); +} + +AboutDialog::~AboutDialog() +{ + delete ui; +} diff --git a/src/lraboutdialog.h b/src/lraboutdialog.h new file mode 100644 index 0000000..f738719 --- /dev/null +++ b/src/lraboutdialog.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRABOUTDIALOG_H +#define LRABOUTDIALOG_H + +#include + +namespace Ui { +class AboutDialog; +} + +class AboutDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AboutDialog(QWidget *parent = 0); + ~AboutDialog(); + +private: + Ui::AboutDialog *ui; +}; + +#endif // LRABOUTDIALOG_H diff --git a/src/lraboutdialog.ui b/src/lraboutdialog.ui new file mode 100644 index 0000000..8007db3 --- /dev/null +++ b/src/lraboutdialog.ui @@ -0,0 +1,264 @@ + + + AboutDialog + + + + 0 + 0 + 661 + 359 + + + + About + + + + + + 0 + + + + Lime Report + + + + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600; color:#555555;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600; color:#555555;"> framework</span></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#000000;">This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; color:#000000;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> + + + + + + + + Author + + + + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> + + + + + + + + License + + + + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">GNU GENERAL PUBLIC LICENSE</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Version 3, 29 June 2007 </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright © 2007 Free Software Foundation, Inc. &lt;http://fsf.org/&gt;</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Preamble </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The GNU General Public License is a free, copyleft license for software and other kinds of works. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The precise terms and conditions for copying, distribution and modification follow. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">TERMS AND CONDITIONS </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">0. Definitions. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">“This License” refers to version 3 of the GNU General Public License. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A “covered work” means either the unmodified Program or a work based on the Program. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1. Source Code. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Corresponding Source for a work in source code form is that same work. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. Basic Permissions. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. Protecting Users' Legal Rights From Anti-Circumvention Law. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4. Conveying Verbatim Copies. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">5. Conveying Modified Source Versions. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a) The work must carry prominent notices stating that you modified it, and giving a relevant date. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">6. Conveying Non-Source Forms. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">7. Additional Terms. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">d) Limiting the use for publicity purposes of names of licensors or authors of the material; or </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">8. Termination. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">9. Acceptance Not Required for Having Copies. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">10. Automatic Licensing of Downstream Recipients. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">11. Patents. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">12. No Surrender of Others' Freedom. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">13. Use with the GNU Affero General Public License. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">14. Revised Versions of this License. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">15. Disclaimer of Warranty. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">16. Limitation of Liability. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">17. Interpretation of Sections 15 and 16. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">END OF TERMS AND CONDITIONS </p></body></html> + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Close + + + + + + + + + Version 0.1.1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + pushButton + clicked() + AboutDialog + accept() + + + 607 + 340 + + + 367 + 323 + + + + + diff --git a/src/lrbanddesignintf.cpp b/src/lrbanddesignintf.cpp new file mode 100644 index 0000000..9787234 --- /dev/null +++ b/src/lrbanddesignintf.cpp @@ -0,0 +1,729 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrbanddesignintf.h" +#include "lritemdesignintf.h" +#include "lrglobal.h" +#include +#include + +namespace LimeReport { + +BandMarker::BandMarker(BandDesignIntf *band, QGraphicsItem* parent) + :QGraphicsItem(parent),m_rect(0,0,30,30),m_band(band) +{} + +QRectF BandMarker::boundingRect() const +{ + return m_rect; +} + +void BandMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem* /**option*/, QWidget* /*widget*/) +{ + painter->save(); + painter->setOpacity(BAND_MARKER_OPACITY); + painter->fillRect(boundingRect(),m_color); + painter->setOpacity(1); + painter->setRenderHint(QPainter::Antialiasing); + qreal size = (boundingRect().width()setBrush(Qt::white); + painter->setPen(Qt::white); + painter->drawEllipse(r.adjusted(5,5,-5,-5)); + if (m_band->isSelected()){ + painter->setBrush(m_color); + painter->drawEllipse(r.adjusted(7,7,-7,-7)); + } + painter->restore(); +} + +void BandMarker::setHeight(qreal height) +{ + if (m_rect.height()!=height){ + prepareGeometryChange(); + m_rect.setHeight(height); + } +} + +void BandMarker::setWidth(qreal width) +{ + if (m_rect.width()!=width){ + prepareGeometryChange(); + m_rect.setWidth(width); + } +} + +void BandMarker::setColor(QColor color) +{ + if (m_color!=color){ + m_color = color; + update(boundingRect()); + } +} + +void BandMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->button()==Qt::LeftButton) { + if (!(event->modifiers() & Qt::ControlModifier)) + m_band->scene()->clearSelection(); + m_band->setSelected(true); + update(0,0,boundingRect().width(),boundingRect().width()); + } +} + +bool Segment::intersect(Segment value) +{ + return ((value.m_end>=m_begin)&&(value.m_end<=m_end)) || + ((value.m_begin>=m_begin)&&(value.m_end>=m_end)) || + ((value.m_begin>=m_begin)&&(value.m_end<=m_end)) || + ((value.m_beginm_end)) ; +} + +qreal Segment::intersectValue(Segment value) +{ + if ((value.m_end>=m_begin)&&(value.m_end<=m_end)){ + return value.m_end-m_begin; + } + if ((value.m_begin>=m_begin)&&(value.m_end>=m_end)){ + return m_end-value.m_begin; + } + if ((value.m_begin>=m_begin)&&(value.m_end<=m_end)){ + return value.m_end-value.m_begin; + } + if ((value.m_beginm_end)){ + return m_end-m_begin; + } + return 0; +} + +BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, QObject* owner, QGraphicsItem *parent) : + BaseDesignIntf(xmlTypeName, owner,parent), + m_bandType(bandType), + m_bandIndex(static_cast(bandType)), + m_dataSourceName(""), + m_autoHeight(true), + m_keepBottomSpace(false), + m_parentBand(0), + m_parentBandName(""), + m_bandMarker(0), + m_tryToKeepTogether(false), + m_splitable(false), + m_keepFooterTogether(false), + m_maxScalePercent(0), + m_sliceLastRow(false), + m_printIfEmpty(false) +{ + setPosibleResizeDirectionFlags(ResizeBottom); + setPosibleMoveFlags(TopBotom); + + if (parent) { + BaseDesignIntf* parentItem = dynamic_cast(parent); + if (parentItem) setWidth(parentItem->width()); + } + + setHeight(100); + setFixedPos(true); + setFlag(QGraphicsItem::ItemClipsChildrenToShape); + m_bandMarker = new BandMarker(this); + m_bandMarker->setColor(Qt::magenta); + m_bandMarker->setHeight(height()); + m_bandMarker->setPos(pos().x()-m_bandMarker->width(),pos().y()); + if (scene()) scene()->addItem(m_bandMarker); +} + +BandDesignIntf::~BandDesignIntf() +{ +// if (itemMode()&DesignMode){ +// foreach(BandDesignIntf* band,childBands()) { +// removeChildBand(band); +// delete band; +// } +// } + + if (m_bandMarker) { + delete m_bandMarker; + } +} + +void BandDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + if (backgroundColor()!=Qt::white) { + ppainter->fillRect(rect(),backgroundColor()); + } + if (itemMode()&DesignMode){ + ppainter->save(); + QString bandText = objectName(); + if (parentBand()) bandText+=QLatin1String(" connected to ")+parentBand()->objectName(); + QFont font("Arial",7*fontFACTOR,-1,true); + QFontMetrics fontMetrics(font); + + QVector bandNameRects; + bandNameRects.push_back(QRectF(8,8,fontMetrics.width(" "+bandText+" "),fontMetrics.height())); + //bandNameRects.push_back(QRectF(width()-fontMetrics.width(" "+bandText+" "),2,fontMetrics.width(" "+bandText+" "),fontMetrics.height())); + //bandNameRects.push_back(QRectF(2,height()-fontMetrics.height(),fontMetrics.width(" "+bandText+" "),fontMetrics.height())); + //bandNameRects.push_back(QRectF(width()-fontMetrics.width(" "+bandText+" "),height()-fontMetrics.height(),fontMetrics.width(" "+bandText+" "),fontMetrics.height())); + //if (bandNameRects[0].intersects(bandNameRects[2])) bandNameRects.remove(2,2); + //if (isSelected()) ppainter->setPen(QColor(167,244,167)); + // else ppainter->setPen(QColor(220,220,220)); + + ppainter->setFont(font); + for (int i=0;isetRenderHint(QPainter::Antialiasing); + ppainter->setBrush(bandColor()); + ppainter->setOpacity(BAND_NAME_AREA_OPACITY); + ppainter->drawRoundedRect(labelRect,8,8); + ppainter->setOpacity(BAND_NAME_TEXT_OPACITY); + ppainter->setPen(Qt::black); + ppainter->drawText(bandNameRects[i]," "+bandText+" "); + } + } + ppainter->restore(); + } + BaseDesignIntf::paint(ppainter,option,widget); +} + +BandDesignIntf::BandsType BandDesignIntf::bandType() const +{ + return m_bandType; +} + +QString BandDesignIntf::bandTitle() const +{ + return m_bandTypeText; +} + +QIcon BandDesignIntf::bandIcon() const +{ + return QIcon(); +} + +int BandDesignIntf::bandIndex() const +{ + return m_bandIndex; +} + +void BandDesignIntf::setBandIndex(int value) +{ + m_bandIndex=value; +} + +bool BandDesignIntf::isUnique() const +{ + return true; +} + +QString BandDesignIntf::datasourceName(){ + return m_dataSourceName; +} + +void BandDesignIntf::setDataSourceName(const QString &datasource){ + m_dataSourceName=datasource; +} + +void BandDesignIntf::addChildBand(BandDesignIntf *band) +{ + m_childBands.append(band); + connect(band,SIGNAL(destroyed(QObject*)),this,SLOT(childBandDeleted(QObject*))); +} + +void BandDesignIntf::removeChildBand(BandDesignIntf *band) +{ + m_childBands.removeAt(m_childBands.indexOf(band)); +} + +void BandDesignIntf::setParentBand(BandDesignIntf *band) +{ + m_parentBand=band; + if (band){ + if (parentBandName().compare(band->objectName(),Qt::CaseInsensitive)!=0) + setParentBandName(band->objectName()); + band->addChildBand(this); + } +} + +void BandDesignIntf::setParentBandName(const QString &parentBandName) +{ + m_parentBandName=parentBandName; + if (itemMode()&DesignMode && !m_parentBandName.isEmpty()){ + if ((parentBand()==0)||(parentBand()->objectName()!=parentBandName)) + setParentBand( findParentBand()); + } +} + +bool BandDesignIntf::isConnectedToBand(BandDesignIntf::BandsType bandType) const +{ + foreach(BandDesignIntf* band,childBands()) if (band->bandType()==bandType) return true; + return false; +} + +int BandDesignIntf::maxChildIndex(QSet bandTypes) const +{ + if (childBands().isEmpty()) return bandIndex(); + else{ + int curIndex=-1; + BandDesignIntf* curBand=0; + foreach(BandDesignIntf* band,childBands()){ + if (curIndexbandIndex()&&bandTypes.contains(band->bandType())){ + curIndex=band->bandIndex();curBand=band; + } + } + return (curBand)?std::max(curBand->maxChildIndex(bandTypes),bandIndex()):bandIndex(); + } +} + +int BandDesignIntf::groupFooterIndex(int groupHeaderIndex) +{ + foreach(BandDesignIntf* band, childBands()){ + if ((band->bandType()==BandDesignIntf::GroupHeader)&& + (band->bandIndex()>groupHeaderIndex)&& + (band->hasChildren()) + ){ + return dynamic_cast(band->childBands().at(0))->bandIndex(); + } + } + return maxChildIndex(subdetailBands()); +} + +int BandDesignIntf::groupHeaderIndex() +{ + int index=bandIndex(); + foreach(BandDesignIntf* band, childBands()){ + if (subdetailBands().contains(band->bandType())){ + if (index>band->bandIndex()) index=band->bandIndex(); + } + } + return index; +} + +QList BandDesignIntf::childrenByType(BandDesignIntf::BandsType type) +{ + QList resList; + foreach(BandDesignIntf* item,childBands()){ + if (item->bandType()==type) resList<(qgItem); + if (item) + //if (!item->canBeSplitted(height-item->pos().y())) return false; + if ((item->minHeight()>height) && (item->minHeight()>(this->height()-height))) return false; + } + } + return true; +} + +bool BandDesignIntf::isEmpty() const +{ + foreach(QGraphicsItem* qgItem,childItems()){ + BaseDesignIntf* item = dynamic_cast(qgItem); + if ((item)&&(!item->isEmpty())) return false; + } + return true; +} + +bool BandDesignIntf::isNeedRender() const +{ + return true; +} + +void BandDesignIntf::setTryToKeepTogether(bool value) +{ + m_tryToKeepTogether=value; +} + +bool BandDesignIntf::tryToKeepTogether() +{ + return m_tryToKeepTogether; +} + +void BandDesignIntf::checkEmptyTable(){ + bool isEmpty = true; + bool allItemsIsText = true; + foreach (QGraphicsItem* qgItem, childItems()) { + BaseDesignIntf* item = dynamic_cast(qgItem); + if (item && !item->isEmpty()) isEmpty = false; + if (!item) allItemsIsText = false; + } + if (isEmpty && allItemsIsText){ + foreach (QGraphicsItem* qgItem, childItems()) { + ContentItemDesignIntf* item = dynamic_cast(qgItem); + item->setHeight(0); + } + } +} + +BaseDesignIntf* BandDesignIntf::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent) +{ + int maxBottom = 0; + BandDesignIntf* upperPart = dynamic_cast(createSameTypeItem(owner,parent)); + BaseDesignIntf* upperItem; + + upperPart->initFromItem(this); + + foreach(QGraphicsItem* qgItem,childItems()){ + BaseDesignIntf* item = dynamic_cast(qgItem); + if (item){ + if (item->geometry().bottom()<=height){ + upperItem = item->cloneItem(item->itemMode(),upperPart,upperPart); + if (maxBottomgeometry().bottom()) maxBottom = upperItem->geometry().bottom(); + } + else if ((item->geometry().top()geometry().bottom()>height)){ + int sliceHeight = height-item->geometry().top(); + if (!item->isSplittable()){ + if (sliceHeight>(this->height()-sliceHeight)){ + upperItem = item->cloneItem(item->itemMode(),upperPart,upperPart); + upperItem->setHeight(height); + } else { + item->cloneEmpty(sliceHeight,upperPart,upperPart); //for table + qgItem->setPos(item->pos().x(),item->pos().y()+((height+1)-item->geometry().top())); + } + } else if (item->canBeSplitted(sliceHeight)){ + upperItem = item->cloneUpperPart(sliceHeight,upperPart,upperPart); + if (maxBottomgeometry().bottom()) maxBottom = upperItem->geometry().bottom(); + } else { + item->cloneEmpty(sliceHeight,upperPart,upperPart); //for table + qgItem->setPos(item->pos().x(),item->pos().y()+((height+1)-item->geometry().top())); + } + } + } + } + upperPart->setHeight(height); + height = maxBottom; + return upperPart; +} + +BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) +{ + BandDesignIntf* bottomPart = dynamic_cast(createSameTypeItem(owner,parent)); + bottomPart->initFromItem(this); + + foreach(QGraphicsItem* qgItem,childItems()){ + BaseDesignIntf* item = dynamic_cast(qgItem); + + if (item){ + if (item->geometry().top()>height){ + BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart); + tmpItem->setPos(tmpItem->pos().x(),tmpItem->pos().y()-height); + } + else if ((item->geometry().top()geometry().bottom()>height)){ + int sliceHeight = height-item->geometry().top(); + if (item->canBeSplitted(sliceHeight)) { + BaseDesignIntf* tmpItem=item->cloneBottomPart(sliceHeight,bottomPart,bottomPart); + tmpItem->setPos(tmpItem->pos().x(),0); + if (tmpItem->pos().y()<0) tmpItem->setPos(tmpItem->pos().x(),0); + } + else if (item->isSplittable()){ + BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart); + tmpItem->setPos(tmpItem->pos().x(),0); + } else { + if ((item->geometry().bottom()-height)>height){ + BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart); + tmpItem->setPos(tmpItem->pos().x(),0); + tmpItem->setHeight((this->height()-height)); + } else { + BaseDesignIntf* tmpItem = item->cloneEmpty((this->height()-height),bottomPart,bottomPart); + if (tmpItem) + tmpItem->setPos(tmpItem->pos().x(),0); + } + } + } + } + } + + return bottomPart; +} + +void BandDesignIntf::parentObjectLoadFinished() +{ + if (!parentBandName().isEmpty()) + setParentBand(findParentBand()); +} + +void BandDesignIntf::objectLoadFinished() +{ + m_bandMarker->setHeight(height()); + BaseDesignIntf::objectLoadFinished(); +} + +void BandDesignIntf::emitBandRendered(BandDesignIntf* band) +{ + emit bandRendered(band); +} + +bool itemSortContainerLessThen(const PItemSortContainer c1, const PItemSortContainer c2) +{ + VSegment vS1(c1->m_rect),vS2(c2->m_rect); + HSegment hS1(c1->m_rect),hS2(c2->m_rect); + if (vS1.intersectValue(vS2)>hS1.intersectValue(hS2)) + return c1->m_rect.x()m_rect.x(); + else return c1->m_rect.y()m_rect.y(); +} + +bool bandIndexLessThen(const BandDesignIntf* b1, const BandDesignIntf* b2) +{ + return b1->bandIndex()bandIndex(); +} + +void BandDesignIntf::snapshotItemsLayout() +{ + m_bandItems.clear(); + foreach(BaseDesignIntf *childItem,childBaseItems()){ + m_bandItems.append(PItemSortContainer(new ItemSortContainer(childItem))); + } + qSort(m_bandItems.begin(),m_bandItems.end(),itemSortContainerLessThen); +} + +void BandDesignIntf::arrangeSubItems(RenderPass pass, ArrangeType type) +{ + bool needArrage=(type==Force); + + foreach (PItemSortContainer item, m_bandItems) { + if (item->m_item->isNeedUpdateSize(pass)){ + item->m_item->updateItemSize(pass); + needArrage=true; + } + } + + if (needArrage){ + //qSort(m_bandItems.begin(),m_bandItems.end(),itemSortContainerLessThen); + for (int i=0;im_item->collidesWithItem(m_bandItems[j]->m_item))){ + HSegment hS1(m_bandItems[j]->m_rect),hS2(m_bandItems[i]->m_rect); + VSegment vS1(m_bandItems[j]->m_rect),vS2(m_bandItems[i]->m_rect); + if (m_bandItems[i]->m_rect.bottom()m_item->geometry().bottom()){ + if (hS1.intersectValue(hS2)>vS1.intersectValue(vS2)) + m_bandItems[j]->m_item->setY(m_bandItems[i]->m_item->y()+m_bandItems[i]->m_item->height() + +m_bandItems[j]->m_rect.top()-m_bandItems[i]->m_rect.bottom()); + + } + if (m_bandItems[i]->m_rect.right()m_item->geometry().right()){ + if (vS1.intersectValue(vS2)>hS1.intersectValue(hS2)) + m_bandItems[j]->m_item->setX(m_bandItems[i]->m_item->geometry().right()+ + (m_bandItems[j]->m_rect.x()-m_bandItems[i]->m_rect.right())); + } + } + } + } + + if(needArrage||pass==FirstPass){ + int maxBottom = findMaxBottom(); + foreach(BaseDesignIntf* item,childBaseItems()){ + ItemDesignIntf* childItem=dynamic_cast(item); + if (childItem){ + if (childItem->stretchToMaxHeight()) + childItem->setHeight(maxBottom-childItem->geometry().top()); + } + } + } + +} + +qreal BandDesignIntf::findMaxBottom() +{ + qreal maxBottom=0; + foreach(QGraphicsItem* item,childItems()){ + BaseDesignIntf* subItem = dynamic_cast(item); + if(subItem) + if (subItem->geometry().bottom()>maxBottom) maxBottom=subItem->geometry().bottom(); + } + return maxBottom; +} + +qreal BandDesignIntf::findMaxHeight(){ + qreal maxHeight=0; + foreach(QGraphicsItem* item,childItems()){ + BaseDesignIntf* subItem = dynamic_cast(item); + if(subItem) + if (subItem->geometry().height()>maxHeight) maxHeight=subItem->geometry().height(); + } + return maxHeight; +} + +void BandDesignIntf::trimToMaxHeight(int maxHeight) +{ + foreach(BaseDesignIntf* item,childBaseItems()){ + if (item->height()>maxHeight) item->setHeight(maxHeight); + } +} + +QSet BandDesignIntf::groupBands() +{ + QSet result; + result< BandDesignIntf::subdetailBands() +{ + QSet result; + result<(parent())->isLoading())){ + foreach(QObject* item, parent()->children()){ + BandDesignIntf* band = dynamic_cast(item); + if(band&&(band->objectName().compare(parentBandName(),Qt::CaseInsensitive)==0)) + return band; + } + } + return 0; +} + +void BandDesignIntf::geometryChangedEvent(QRectF, QRectF ) +{ + if (((itemMode()&DesignMode) || (itemMode()&EditMode))&&parentItem()){ + QPointF sp = parentItem()->mapToScene(pos()); + if (m_bandMarker){ + m_bandMarker->setPos((sp.x()-m_bandMarker->boundingRect().width()),sp.y()); + m_bandMarker->setHeight(rect().height()); + } + } +} + +QVariant BandDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) +{ + if ((change==ItemPositionChange)&&((itemMode()&DesignMode)||(itemMode()&EditMode))){ + if (m_bandMarker){ + m_bandMarker->setPos((value.toPointF().x()-m_bandMarker->boundingRect().width()), + value.toPointF().y()); + } + } + if (change==ItemSelectedChange){ + if (m_bandMarker){ + m_bandMarker->update(0,0, + m_bandMarker->boundingRect().width(), + m_bandMarker->boundingRect().width()); + } + } + return BaseDesignIntf::itemChange(change,value); +} + +void BandDesignIntf::initMode(ItemMode mode) +{ + BaseDesignIntf::initMode(mode); + if ((mode==PreviewMode)||(mode==PrintMode)){ + m_bandMarker->setVisible(false); + } +} + +QColor BandDesignIntf::bandColor() const +{ + return Qt::darkBlue; +} + +void BandDesignIntf::setMarkerColor(QColor color) +{ + if (m_bandMarker) m_bandMarker->setColor(color); +} + +void BandDesignIntf::childBandDeleted(QObject *band) +{ + m_childBands.removeAt(m_childBands.indexOf(reinterpret_cast(band))); +} +bool BandDesignIntf::printIfEmpty() const +{ + return m_printIfEmpty; +} + +void BandDesignIntf::setPrintIfEmpty(bool printIfEmpty) +{ + m_printIfEmpty = printIfEmpty; +} + +bool BandDesignIntf::sliceLastRow() const +{ + return m_sliceLastRow; +} + +void BandDesignIntf::setSliceLastRow(bool sliceLastRow) +{ + m_sliceLastRow = sliceLastRow; +} + +int BandDesignIntf::maxScalePercent() const +{ + return m_maxScalePercent; +} + +void BandDesignIntf::setMaxScalePercent(int maxScalePercent) +{ + m_maxScalePercent = maxScalePercent; +} + +bool BandDesignIntf::keepFooterTogether() const +{ + return m_keepFooterTogether; +} + +void BandDesignIntf::setKeepFooterTogether(bool keepFooterTogether) +{ + m_keepFooterTogether = keepFooterTogether; +} + + +void BandDesignIntf::updateItemSize(RenderPass pass,int maxHeight) +{ + qreal spaceBorder=0; + if (keepBottomSpaceOption()) spaceBorder=height()-findMaxBottom(); + snapshotItemsLayout(); + arrangeSubItems(pass); + if (autoHeight() && height()0)&&(height()>maxHeight)){ + trimToMaxHeight(maxHeight); + setHeight(maxHeight); + } + BaseDesignIntf::updateItemSize(pass,maxHeight); +} + +QColor BandDesignIntf::selectionColor() const +{ + return Qt::yellow; +} + +DataBandDesignIntf::DataBandDesignIntf(BandDesignIntf::BandsType bandType, QString xmlTypeName, QObject *owner, QGraphicsItem *parent) + :BandDesignIntf(bandType,xmlTypeName,owner,parent) +{ +} + +} + + + diff --git a/src/lrbanddesignintf.h b/src/lrbanddesignintf.h new file mode 100644 index 0000000..86eb2ff --- /dev/null +++ b/src/lrbanddesignintf.h @@ -0,0 +1,253 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRBANDDESIGNINTF_H +#define LRBANDDESIGNINTF_H +#include "lrbasedesignintf.h" +#include + +namespace LimeReport { + +class IGropBand +{ +public: + virtual void startGroup()=0; + virtual bool isNeedToClose()=0; + virtual bool isStarted()=0; + virtual void closeGroup()=0; + virtual int index()=0; + virtual ~IGropBand(){} +}; + +class BandDesignIntf; + +class BandMarker : public QGraphicsItem{ +public: + explicit BandMarker(BandDesignIntf* band, QGraphicsItem *parent=0); + virtual QRectF boundingRect() const; + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + void setHeight(qreal height); + void setWidth(qreal width); + void setColor(QColor color); + qreal width(){return m_rect.width();} + qreal height(){return m_rect.height();} +protected: + void mousePressEvent(QGraphicsSceneMouseEvent *event); +private: + QRectF m_rect; + QColor m_color; + BandDesignIntf* m_band; +}; + +struct ItemSortContainer; +typedef QSharedPointer< ItemSortContainer > PItemSortContainer; +class BandDesignIntf : public BaseDesignIntf +{ + Q_OBJECT + Q_PROPERTY(bool autoHeight READ autoHeight WRITE setAutoHeight ) + Q_PROPERTY(int bandIndex READ bandIndex WRITE setBandIndex DESIGNABLE false ) + Q_PROPERTY(bool keepBottomSpace READ keepBottomSpaceOption WRITE setKeepBottomSpaceOption ) + Q_PROPERTY(QString parentBand READ parentBandName WRITE setParentBandName DESIGNABLE false ) + Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) + Q_PROPERTY(bool printIfEmpty READ printIfEmpty WRITE setPrintIfEmpty) + friend class BandMarker; +public: + + enum BandsType { + PageHeader=0, + ReportHeader=1, + Data=4, + SubDetailHeader=5, + SubDetailBand=6, + SubDetailFooter=7, + GroupHeader=3, + GroupFooter=8, + ReportFooter=9, + PageFooter=10 + }; + + BandDesignIntf(BandsType bandType, const QString& xmlTypeName, QObject* owner = 0, QGraphicsItem* parent=0); + ~BandDesignIntf(); + + virtual void paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget); + virtual BandsType bandType() const; + virtual QString bandTitle() const; + virtual QIcon bandIcon() const; + virtual bool isUnique() const; + virtual void updateItemSize(RenderPass pass=FirstPass, int maxHeight=0); + + virtual QColor selectionColor() const; + int bandIndex() const; + void setBandIndex(int value); + + void setBandType(BandsType value){m_bandType=value;} + + QString datasourceName(); + void setDataSourceName(const QString& datasourceName); + + void setKeepBottomSpaceOption(bool value){m_keepBottomSpace=value;} + bool keepBottomSpaceOption() const {return m_keepBottomSpace;} + + void addChildBand(BandDesignIntf* band); + bool hasChildren(){return !m_childBands.isEmpty();} + void removeChildBand(BandDesignIntf* band); + void setParentBand(BandDesignIntf* band); + + void setParentBandName(const QString& parentBandName); + QString parentBandName(){return m_parentBandName;} + + bool isConnectedToBand(BandDesignIntf::BandsType bandType) const; + + int maxChildIndex(QSet bandTypes) const; + int groupFooterIndex(int groupHeaderIndex); + int groupHeaderIndex(); + + BandDesignIntf* parentBand() const {return m_parentBand;} + + QList childBands() const{return m_childBands;} + QList childrenByType(BandDesignIntf::BandsType type); + + virtual bool canBeSplitted(int height) const; + virtual bool isEmpty() const; + virtual bool isNeedRender() const; + virtual bool isFooter() const {return false;} + virtual bool isData() const {return false;} + + void setTryToKeepTogether(bool value); + bool tryToKeepTogether(); + + BaseDesignIntf* cloneUpperPart(int height, QObject* owner=0, QGraphicsItem* parent=0); + BaseDesignIntf* cloneBottomPart(int height, QObject *owner=0, QGraphicsItem *parent=0); + void parentObjectLoadFinished(); + void objectLoadFinished(); + void emitBandRendered(BandDesignIntf *band); + + bool isSplittable() const {return m_splitable;} + void setSplittable(bool value){m_splitable=value;} + + bool keepFooterTogether() const; + void setKeepFooterTogether(bool keepFooterTogether); + + int maxScalePercent() const; + void setMaxScalePercent(int maxScalePercent); + + bool sliceLastRow() const; + void setSliceLastRow(bool sliceLastRow); + + bool printIfEmpty() const; + void setPrintIfEmpty(bool printIfEmpty); + +signals: + void bandRendered(BandDesignIntf* band); +protected: + void snapshotItemsLayout(); + void arrangeSubItems(RenderPass pass, ArrangeType type = AsNeeded); + qreal findMaxBottom(); + qreal findMaxHeight(); + void trimToMaxHeight(int maxHeight); + + void setAutoHeight(bool value){m_autoHeight=value;} + bool autoHeight(){return m_autoHeight;} + + void setBandTypeText(const QString& value){m_bandTypeText=value;} + QString bandTypeText(){return m_bandTypeText;} + virtual void moveDown(){} + virtual void moveUp(){} + QSet groupBands(); + QSet subdetailBands(); + BandDesignIntf *findParentBand(); + virtual void geometryChangedEvent(QRectF, QRectF); + virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); + virtual void initMode(ItemMode mode); + virtual QColor bandColor() const; + void setMarkerColor(QColor color); + void checkEmptyTable(); +private slots: + void childBandDeleted(QObject* band); +private: + QString m_bandTypeText; + BandsType m_bandType; + int m_bandIndex; + QString m_dataSourceName; + bool m_autoHeight; + bool m_keepBottomSpace; + BandDesignIntf* m_parentBand; + QString m_parentBandName; + QList m_childBands; + QVector m_bandItems; + BandMarker* m_bandMarker; + bool m_tryToKeepTogether; + bool m_splitable; + bool m_keepFooterTogether; + int m_maxScalePercent; + bool m_sliceLastRow; + bool m_printIfEmpty; +}; + +class DataBandDesignIntf : public BandDesignIntf{ + Q_OBJECT + Q_PROPERTY(QString datasource READ datasourceName WRITE setDataSourceName ) +public: + DataBandDesignIntf(BandsType bandType, QString xmlTypeName, QObject* owner = 0, QGraphicsItem* parent=0); +}; + +class Segment{ +public: + Segment(qreal segmentStart,qreal segmentEnd):m_begin(segmentStart),m_end(segmentEnd){} + bool intersect(Segment value); + qreal intersectValue(Segment value); +private: + qreal m_begin; + qreal m_end; +}; + +class VSegment : public Segment{ +public: + VSegment(QRectF rect):Segment(rect.top(),rect.bottom()){} +}; + +struct HSegment :public Segment{ +public: + HSegment(QRectF rect):Segment(rect.left(),rect.right()){} +}; + +struct ItemSortContainer { + QRectF m_rect; + BaseDesignIntf * m_item; + ItemSortContainer(BaseDesignIntf *item){ + m_item=item; + m_rect=item->geometry(); + } +}; + +bool itemSortContainerLessThen(const PItemSortContainer c1, const PItemSortContainer c2); +bool bandIndexLessThen(const BandDesignIntf* b1, const BandDesignIntf* b2); + +} +#endif // LRBANDDESIGNINTF_H diff --git a/src/lrbandsmanager.cpp b/src/lrbandsmanager.cpp new file mode 100644 index 0000000..6a15969 --- /dev/null +++ b/src/lrbandsmanager.cpp @@ -0,0 +1,93 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrbandsmanager.h" +#include "lrglobal.h" + +#include "lrpageheader.h" +#include "lrpagefooter.h" +#include "lrreportheader.h" +#include "lrreportfooter.h" +#include "lrdataband.h" +#include "lrsubdetailband.h" +#include "lrgroupbands.h" + +namespace LimeReport{ +BandsManager::BandsManager(){} + +QStringList BandsManager::bandNames() +{ + QStringList bandsList; + bandsList<(LimeReport::DesignElementsFactory::instance().objectCreator(identity)(owner,parent)); +} + +BandDesignIntf *BandsManager::createBand(BandDesignIntf::BandsType bandType, QObject *owner, BaseDesignIntf *parent) +{ + switch(bandType){ + case BandDesignIntf::ReportHeader: + return new ReportHeader(owner,parent); + case BandDesignIntf::ReportFooter: + return new ReportFooter(owner,parent); + case BandDesignIntf::PageHeader: + return new PageHeader(owner,parent); + case BandDesignIntf::PageFooter: + return new PageFooter(owner,parent); + case BandDesignIntf::Data: + return new DataBand(owner,parent); + case BandDesignIntf::SubDetailBand: + return new SubDetailBand(owner,parent); + case BandDesignIntf::SubDetailHeader: + return new SubDetailHeaderBand(owner,parent); + case BandDesignIntf::SubDetailFooter: + return new SubDetailFooterBand(owner,parent); + case BandDesignIntf::GroupHeader: + return new GroupBandHeader(owner, parent); + case BandDesignIntf::GroupFooter: + return new GroupBandFooter(owner, parent); + } + + return 0; +} + +} diff --git a/src/lrbandsmanager.h b/src/lrbandsmanager.h new file mode 100644 index 0000000..0a850c7 --- /dev/null +++ b/src/lrbandsmanager.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRBANDSMANAGER_H +#define LRBANDSMANAGER_H + +#include +#include +#include +#include "lrdesignelementsfactory.h" +#include "lrbanddesignintf.h" +#include "lrbasedesignintf.h" + +namespace LimeReport{ +class BandsManager +{ +public: + BandsManager(); + QStringList bandNames(); + BandDesignIntf * createBand(const QString& type, QObject* owner, LimeReport::BaseDesignIntf* parent ); + BandDesignIntf * createBand(BandDesignIntf::BandsType bandType, QObject* owner, LimeReport::BaseDesignIntf* parent ); +}; +} +#endif // LRBANDSMANAGER_H diff --git a/src/lrbasedesignintf.cpp b/src/lrbasedesignintf.cpp new file mode 100644 index 0000000..66b72d0 --- /dev/null +++ b/src/lrbasedesignintf.cpp @@ -0,0 +1,1100 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include "lrbasedesignintf.h" +#include "lrglobal.h" +#include "lrpagedesignintf.h" +#include "lrreportdesignwidget.h" +#include "qgraphicsitem.h" +#include "lrdesignelementsfactory.h" + +#include "lrhorizontallayout.h" + +#include + +#include +#include +#include +#include +#include + +namespace LimeReport +{ + +BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, QGraphicsItem *parent) : + QObject(owner), QGraphicsItem(parent), + m_resizeHandleSize(Consts::RESIZE_HANDLE_SIZE), + m_selectionPenSize(Consts::SELECTION_PEN_SIZE), + m_posibleResizeDirectionFlags(ResizeTop | ResizeBottom | ResizeLeft | ResizeRight), + m_posibleMoveDirectionFlags(All), + m_resizeDirectionFlags(0), + m_width(200), + m_height(50), + m_fontColor(Qt::black), + m_mmFactor(mmFACTOR), + m_fixedPos(false), + m_BGMode(OpaqueMode), + m_opacity(100), + m_borderLinesFlags(0), + m_hintFrame(0), + m_storageTypeName(storageTypeName), + m_itemMode(DesignMode), + m_objectState(ObjectCreated), + m_selectionMarker(0), + m_backgroundBrush(Solid), + m_backgroundBrushcolor(Qt::white), + m_margin(4) +{ + setGeometry(QRectF(0, 0, m_width, m_height)); + if (BaseDesignIntf *item = dynamic_cast(parent)) { + m_font = item->font(); + } else{ + m_font = QFont("Arial",10); + } + initFlags(); + m_selectionMarker = new SelectionMarker(this); + m_selectionMarker->setColor(Consts::SELECTION_COLOR); + m_selectionMarker->setVisible(false); + //connect(this,SIGNAL(objectNameChanged(QString)),this,SLOT(slotObjectNameChanged(QString))); +} + +QRectF BaseDesignIntf::boundingRect() const +{ + if (m_boundingRect.isNull()) { + qreal halfpw = pen().widthF() / 2; + halfpw += 2; + m_boundingRect = rect(); + m_boundingRect.adjust(-halfpw, -halfpw, halfpw, halfpw); + }; + return m_boundingRect; +} + +BaseDesignIntf::~BaseDesignIntf(void) {delete m_selectionMarker;} + +void BaseDesignIntf::setParentReportItem(const QString &value) +{ + if (page() && !value.isEmpty()) { + BaseDesignIntf *p = page()->reportItemByName(value); + if (p) { + setParentItem(p); + setParent(p); + } + } +} + +QString BaseDesignIntf::parentReportItem() +{ + BaseDesignIntf *parent = dynamic_cast(parentItem()); + if (parent) return parent->objectName(); + else return ""; +} + +void BaseDesignIntf::setBackgroundBrushMode(BaseDesignIntf::BrushMode value) +{ + if ( value != m_backgroundBrush ){ + m_backgroundBrush=value; + if (!isLoading()) update(); + } +} + +void BaseDesignIntf::setBackgroundColor(QColor value) +{ + if (value != m_backgroundBrushcolor){ + QColor oldValue = m_backgroundBrushcolor; + m_backgroundBrushcolor=value; + if (!isLoading()) update(); + notify("backgroundColor",oldValue,m_backgroundBrushcolor); + } +} + +QPen BaseDesignIntf::pen() const +{ + return m_pen; +} + +void BaseDesignIntf::setPen(QPen &pen) +{ + m_pen = pen; + update(); +} + +QFont BaseDesignIntf::font() const +{ + return m_font; +} + +void BaseDesignIntf::setFont(QFont &font) +{ + m_font = font; + update(); +} + +qreal BaseDesignIntf::width() const +{ + return rect().width(); +} + +void BaseDesignIntf::setWidth(qreal width) +{ + setGeometry(QRectF(rect().x(), rect().y(), width, rect().height())); +} + +qreal BaseDesignIntf::height() const +{ + return rect().height(); +} + +QRectF BaseDesignIntf::geometry() const +{ + return QRectF(pos().x(), pos().y(), width(), height()); +} + +void BaseDesignIntf::setHeight(qreal height) +{ + setGeometry(QRectF(rect().x(), rect().y(), rect().width(), height)); +} + +QFont BaseDesignIntf::transformToSceneFont(const QFont& value) const +{ + QFont f = value; + f.setPixelSize(f.pointSize()*fontFACTOR); + return f; +} + +void BaseDesignIntf::setupPainter(QPainter *painter) const +{ + if (!painter) { + return; + } + painter->setFont(m_font); + painter->setPen(m_fontColor); +} + +BaseDesignIntf::BGMode BaseDesignIntf::backgroundMode() const +{ + return m_BGMode; +} +void BaseDesignIntf::setBackgroundMode(BGMode bgMode) +{ + m_BGMode = bgMode; + update(boundingRect()); +} + +int BaseDesignIntf::opacity() const +{ + return m_opacity; +} + +void BaseDesignIntf::setOpacity(int opacity) +{ + if (m_opacity!=opacity){ + if (opacity < 0) { + m_opacity = 0; + } + else if (opacity > 100) { + m_opacity = 100; + } + else { + m_opacity = opacity; + } + update(); + } +} + +void BaseDesignIntf::setSize(QSizeF size) +{ + setWidth(size.width()); + setHeight(size.height()); +} + +QSizeF BaseDesignIntf::size() const +{ + return QSizeF(width(), height()); +} + +QSizeF BaseDesignIntf::sizeMM() const +{ + return QSizeF(width() / m_mmFactor, height() / m_mmFactor); +} + +qreal BaseDesignIntf::widthMM() const +{ + return width() / m_mmFactor; +} + +qreal BaseDesignIntf::heightMM() const +{ + return height() / m_mmFactor; +} + +void BaseDesignIntf::setMMFactor(qreal mmFactor) +{ + m_mmFactor = mmFactor; +} + +qreal BaseDesignIntf::mmFactor() const +{ + return m_mmFactor; +} + +QPointF BaseDesignIntf::posMM() const +{ + return QPointF(pos().x() / m_mmFactor, pos().y() / m_mmFactor); +} + +QRectF BaseDesignIntf::rect() const +{ + return m_rect; +} + +void BaseDesignIntf::setFixedPos(bool fixedPos) +{ + m_fixedPos = fixedPos; +} + +void BaseDesignIntf::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + m_resizeDirectionFlags = resizeDirectionFlags(event->pos()); + m_startScenePos = event->scenePos(); + m_startPos = pos(); + m_oldGeometry = geometry(); + QGraphicsItem::mousePressEvent(event); + QApplication::processEvents(); + emit(itemSelected(this)); + } + else QGraphicsItem::mouseMoveEvent(event); +} + +void BaseDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + setupPainter(ppainter); + + drawBorder(ppainter, rect()); + if (isSelected()) {drawSelection(ppainter, rect());} + drawResizeZone(ppainter); +} + +void BaseDesignIntf::prepareRect(QPainter *ppainter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) +{ + ppainter->save(); + if (isSelected() && (opacity() == 100) && (m_BGMode!=TransparentMode)) { + ppainter->fillRect(rect(), QBrush(QColor(m_backgroundBrushcolor))); + } + else { + if (m_BGMode == OpaqueMode) { + ppainter->setOpacity(qreal(m_opacity) / 100); + ppainter->fillRect(rect(), QBrush(m_backgroundBrushcolor)); + } + } + ppainter->restore(); +} + +void BaseDesignIntf::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + if (page()) { + if (!page()->isItemInsertMode()) { + if (m_resizeDirectionFlags != resizeDirectionFlags(event->pos())) { + m_resizeDirectionFlags = resizeDirectionFlags(event->pos()); + QVectoroldResizeAreas(m_resizeAreas); + initResizeZones(); + invalidateRects(oldResizeAreas); + invalidateRects(m_resizeAreas); + } + } + } +} + +void BaseDesignIntf::invalidateRects(QVector rects) +{ + foreach(QRectF * rect, rects) + scene()->update(mapToScene(*rect).boundingRect()); +} + +void BaseDesignIntf::hoverLeaveEvent(QGraphicsSceneHoverEvent *) +{ + setCursor(QCursor(Qt::ArrowCursor)); + m_resizeDirectionFlags = 0; + scene()->update(sceneBoundingRect()); + m_resizeAreas.clear(); +} + + +void BaseDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + + if (m_resizeDirectionFlags & ResizeLeft) { + if ((event->scenePos().x()) <= (mapToScene(0, 0).x() + (width() - Consts::MINIMUM_ITEM_WIDTH)) && + (width() + (event->lastScenePos().x() - event->scenePos().x()) > Consts::MINIMUM_ITEM_WIDTH) + ) { + qreal posRightConner = mapToScene(0, 0).x() + width(); + setItemPos(mapToParent(mapFromScene(div(event->scenePos().x(), 2).quot * 2, y())).x(), y()); + setWidth(posRightConner - div(event->scenePos().x(), 2).quot * 2); + } + } + + if (m_resizeDirectionFlags & ResizeRight) { + if ((event->scenePos().x() >= (mapToScene(0, 0).x() + Consts::MINIMUM_ITEM_WIDTH)) || + (event->scenePos().x() >= (mapToScene(0, 0).x() + width()))) { + setWidth(div(int(event->scenePos().x()) - int(mapToScene(0, 0).x()), 2).quot * 2); + } + } + + if (m_resizeDirectionFlags & ResizeBottom) { + if ((event->scenePos().y() > (mapToScene(0, 0).y() + height())) || + (event->scenePos().y() > (mapToScene(0, 0).y() + Consts::MINIMUM_ITEM_HEIGHT)) + ) { + setHeight(div(int(event->scenePos().y()) - int(mapToScene(0, 0).y()), 2).quot * 2); + } + } + + if (m_resizeDirectionFlags & ResizeTop) { + + if ((event->scenePos().y()) <= (mapToScene(0, 0).y() + (height() - Consts::MINIMUM_ITEM_HEIGHT)) && + (height() + (event->lastScenePos().y() - event->scenePos().y()) > Consts::MINIMUM_ITEM_HEIGHT) + ) { + qreal posBottomConner = int(mapToScene(0, 0).y()) + int(height()); + setItemPos(x(), div(mapToParent(event->pos()).y(), 2).quot * 2); + setHeight(posBottomConner - div(event->scenePos().y(), 2).quot * 2); + } + } + + if ((m_resizeDirectionFlags == Fixed) && !m_fixedPos) { + + QPointF tmpPos = pos(); + QPointF delta; + switch (posibleMoveDirectionFlags()) { + case LeftRight: { + delta = QPoint(div(m_startScenePos.x() - event->scenePos().x(), 2).quot * 2, 0); + break; + } + case TopBotom: { + delta = QPoint(0, div(m_startScenePos.y() - event->scenePos().y(), 2).quot * 2); + break; + } + case All: { + delta = QPoint(div(m_startScenePos.x() - event->scenePos().x(), 2).quot * 2, + div(m_startScenePos.y() - event->scenePos().y(), 2).quot * 2); + break; + } + }; + + setItemPos(m_startPos - delta); + moveSelectedItems(tmpPos - pos()); + } +} + +int BaseDesignIntf::posibleResizeDirectionFlags() const +{ + return m_posibleResizeDirectionFlags; +} + +int BaseDesignIntf::resizeHandleSize() const +{ + return m_resizeHandleSize; +} + +int BaseDesignIntf::resizeDirectionFlags(QPointF position) +{ + int flags = Fixed; + + if (posibleResizeDirectionFlags()&ResizeTop && m_topRect.contains(position)) { + flags |= ResizeTop; + } + + if (posibleResizeDirectionFlags()&ResizeLeft && m_leftRect.contains(position)) { + flags |= ResizeLeft; + } + + if (posibleResizeDirectionFlags()&ResizeBottom && m_bottomRect.contains(position)) { + flags |= ResizeBottom; + } + + if (posibleResizeDirectionFlags()&ResizeRight && m_rightRect.contains(position)) { + flags |= ResizeRight; + } + +// if (posibleResizeDirectionFlags()&FixedSize) { +// flags |= FixedSize; +// } + + return flags; +} + +Qt::CursorShape BaseDesignIntf::getPosibleCursor(int cursorFlags) +{ + + if ((cursorFlags == Fixed) || (scene()->selectedItems().count() > 1)) return Qt::ArrowCursor; + + if (((cursorFlags & ResizeRight) && (cursorFlags & ResizeTop)) || + ((cursorFlags & ResizeLeft) && (cursorFlags & ResizeBottom))) { + return Qt::SizeBDiagCursor; + } + if (((cursorFlags & ResizeLeft) && (cursorFlags & ResizeTop)) || + ((cursorFlags & ResizeRight) && (cursorFlags & ResizeBottom))) { + return Qt::SizeFDiagCursor; + } + if ((cursorFlags & ResizeLeft) || (cursorFlags & ResizeRight)) { return Qt::SizeHorCursor; } + if ((cursorFlags & ResizeBottom) || (cursorFlags & ResizeTop)) { return Qt::SizeVerCursor; } + + return Qt::ArrowCursor; +} + +void BaseDesignIntf::setZValueProperty(qreal value) +{ + if (zValue()!=value){ + qreal oldValue = zValue(); + setZValue(value); + notify("zOrder",oldValue,value); + } +} + +//void BaseDesignIntf::slotObjectNameChanged(const QString &newName) +//{ +// if (!isLoading() && page() && this->itemMode()==LimeReport::DesignMode){ +// QList list = page()->reportItemsByName(newName); +// if (list.size()>1){ +// setObjectName(page()->genObjectName(*this)); +// notify("objectName",newName,objectName()); +// } + +// } +//} + +QString BaseDesignIntf::itemTypeName() const +{ + return m_itemTypeName; +} + +void BaseDesignIntf::setItemTypeName(const QString &itemTypeName) +{ + m_itemTypeName = itemTypeName; +} + +void BaseDesignIntf::emitObjectNamePropertyChanged(const QString &oldName, const QString &newName) +{ + emit propertyObjectNameChanged(oldName,newName); +} + + +void BaseDesignIntf::moveRight() +{ + if (!m_fixedPos) setItemPos(pos().x() + 2, pos().y()); +} + +void BaseDesignIntf::moveLeft() +{ + if (!m_fixedPos) setItemPos(pos().x() - 2, pos().y()); +} + +void BaseDesignIntf::moveDown() +{ + if (!m_fixedPos) setItemPos(pos().x(), pos().y() + 2); +} + +void BaseDesignIntf::moveUp() +{ + if (!m_fixedPos) setItemPos(pos().x(), pos().y() - 2); +} + +void BaseDesignIntf::sizeRight() +{ + if ((m_posibleResizeDirectionFlags & ResizeLeft) || + (m_posibleResizeDirectionFlags & ResizeRight)) { + setWidth(width() + 2); + } +} + +void BaseDesignIntf::sizeLeft() +{ + if ((m_posibleResizeDirectionFlags & ResizeLeft) || + (m_posibleResizeDirectionFlags & ResizeRight)) { + setWidth(width() - 2); + } +} + +void BaseDesignIntf::sizeUp() +{ + if ((m_posibleResizeDirectionFlags & ResizeTop) || + (m_posibleResizeDirectionFlags & ResizeBottom)) { + setHeight(height() - 2); + } +} + +void BaseDesignIntf::sizeDown() +{ + if ((m_posibleResizeDirectionFlags & ResizeTop) || + (m_posibleResizeDirectionFlags & ResizeBottom)) { + setHeight(height() + 2); + } +} + +void BaseDesignIntf::setBorderLinesFlags(BorderLines flags) +{ + if (m_borderLinesFlags!=flags){ + BorderLines oldValue = m_borderLinesFlags; + m_borderLinesFlags = flags; + if (!isLoading()) { + update(rect()); + notify("borders",QVariant(oldValue),QVariant(flags)); + } + } +} + +BaseDesignIntf::BorderLines BaseDesignIntf::borderLines() const +{ + return m_borderLinesFlags; +} + +void BaseDesignIntf::drawTopLine(QPainter *painter, QRectF rect) const +{ + painter->setPen(borderPen(TopLine)); + painter->drawLine(rect.x(), rect.y(), rect.width(), rect.y()); +} + +void BaseDesignIntf::drawBootomLine(QPainter *painter, QRectF rect) const +{ + painter->setPen(borderPen(BottomLine)); + painter->drawLine(rect.x(), rect.height(), rect.width(), rect.height()); +} + +void BaseDesignIntf::drawRightLine(QPainter *painter, QRectF rect) const +{ + painter->setPen(borderPen(RightLine)); + painter->drawLine(rect.width(), rect.y(), rect.width(), rect.height()); +} + +void BaseDesignIntf::drawLeftLine(QPainter *painter, QRectF rect) const +{ + painter->setPen(borderPen(LeftLine)); + painter->drawLine(rect.x(), rect.y(), rect.x(), rect.height()); +} + +void BaseDesignIntf::drawDesignModeBorder(QPainter *painter, QRectF rect) const +{ + drawTopLine(painter, rect); + drawBootomLine(painter, rect); + drawLeftLine(painter, rect); + drawRightLine(painter, rect); +} + +void BaseDesignIntf::drawRenderModeBorder(QPainter *painter, QRectF rect) const +{ + + if (m_borderLinesFlags & RightLine) drawRightLine(painter, rect); + if (m_borderLinesFlags & LeftLine) drawLeftLine(painter, rect); + if (m_borderLinesFlags & TopLine ) drawTopLine(painter, rect); + if (m_borderLinesFlags & BottomLine) drawBootomLine(painter, rect); +} + +void BaseDesignIntf::drawBorder(QPainter *painter, QRectF rect) const +{ + painter->save(); + if (itemMode() & DesignMode) { + drawDesignModeBorder(painter, rect); + } + else drawRenderModeBorder(painter, rect); + painter->restore(); +} + +void BaseDesignIntf::setGeometry(QRectF rect) +{ + if (m_rect == rect) return; + m_oldGeometry = m_rect; + if (!isLoading()) + prepareGeometryChange(); + m_rect = rect; + m_topRect = QRectF(0, 0, width(), resizeHandleSize()); + m_bottomRect = QRectF(0, height() - resizeHandleSize(), width(), resizeHandleSize()); + m_leftRect = QRectF(0, 0, resizeHandleSize(), height()); + m_rightRect = QRectF(width() - resizeHandleSize(), 0, resizeHandleSize(), height()); + m_boundingRect = QRectF(); + updateSelectionMarker(); + if (!isLoading()){ + geometryChangedEvent(geometry(), m_oldGeometry); + emit geometryChanged(this, geometry(), m_oldGeometry); + } +} + +void BaseDesignIntf::geometryChangedEvent(QRectF newRect, QRectF oldRect) +{ + Q_UNUSED(oldRect); + Q_UNUSED(newRect); +} + +void BaseDesignIntf::beforeDelete() +{ + +} + +void BaseDesignIntf::setGeometryProperty(QRectF rect) +{ + if (rect!=geometry()){ + QRectF oldValue = geometry(); + if ((rect.x() != geometry().x()) || (rect.y() != geometry().y())) + setPos(rect.x(), rect.y()); + if (rect.width() != geometry().width()) + setWidth(rect.width()); + if (rect.height() != geometry().height()) + setHeight(rect.height()); + + if (!isLoading()) notify("geometry",oldValue,rect); + } + +} + +PageDesignIntf *BaseDesignIntf::page() +{ + return dynamic_cast(scene()); +} + +void BaseDesignIntf::setPosibleResizeDirectionFlags(int directionsFlags) +{ + m_posibleResizeDirectionFlags = directionsFlags; +} + +QPen BaseDesignIntf::borderPen(BorderSide side/*, bool selected*/) const +{ + QPen pen; + if (m_borderLinesFlags & side) {pen.setColor(Qt::black); pen.setStyle(Qt::SolidLine);} + else {pen.setColor(Qt::darkGray); pen.setStyle(Qt::SolidLine);} + return pen; +} + +QColor BaseDesignIntf::selectionColor() const +{ + return Consts::SELECTION_COLOR; +} + +void BaseDesignIntf::initFlags() +{ + if ((itemMode()&DesignMode) || (itemMode()&EditMode)) { + setFlag(QGraphicsItem::ItemIsSelectable); + setFlag(QGraphicsItem::ItemSendsGeometryChanges); + setAcceptHoverEvents(true); + } + else { + setFlag(QGraphicsItem::ItemIsSelectable, false); + setAcceptHoverEvents(false); + } + +} + +void BaseDesignIntf::initMode(ItemMode mode) +{ + Q_UNUSED(mode); +} + +QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) +{ + if (change == QGraphicsItem::ItemPositionHasChanged) { + updateSelectionMarker(); + } + if (change == QGraphicsItem::ItemSelectedChange) { + updateSelectionMarker(); + m_selectionMarker->setVisible(value.toBool()); + } + return QGraphicsItem::itemChange(change, value); +} + +void BaseDesignIntf::childAddedEvent(BaseDesignIntf *child) +{ + Q_UNUSED(child) +} + +QPainterPath BaseDesignIntf::shape() const +{ + QPainterPath path; + path.addRect(this->boundingRect()); + return path; +} + +void BaseDesignIntf::drawSelection(QPainter *painter, QRectF /*rect*/) const +{ + painter->save(); + // painter->setPen(QPen(Qt::red,m_selectionPenSize)); + // painter->drawLine(QPointF(m_resizeHandleSize,0),QPointF(0,0)); + // painter->drawLine(QPointF(0,m_resizeHandleSize),QPointF(0,0)); + // painter->drawLine(rect.right()-m_resizeHandleSize,0,rect.right(),0); + // painter->drawLine(rect.right(),m_resizeHandleSize,rect.right(),0); + // painter->drawLine(0,rect.bottom(),0,rect.bottom()-10); + // painter->drawLine(0,rect.bottom(),m_resizeHandleSize,rect.bottom()); + // painter->drawLine(rect.right()-m_resizeHandleSize,rect.bottom(),rect.right(),rect.bottom()); + // painter->drawLine(rect.right(),rect.bottom()-m_resizeHandleSize,rect.right(),rect.bottom()); + // painter->setOpacity(Consts::SELECTION_COLOR_OPACITY); + // painter->fillRect(rect,selectionColor()); + painter->restore(); +} + +void BaseDesignIntf::moveSelectedItems(QPointF delta) +{ + QList selectedItems; + selectedItems = scene()->selectedItems(); + BaseDesignIntf *selectedItem; + foreach(QGraphicsItem * item, selectedItems) { + if (item != this) { + selectedItem = dynamic_cast(item); + if (selectedItem) { + if (!selectedItem->m_fixedPos) + selectedItem->setItemPos(selectedItem->pos() - delta); + } + } + } +} + +void BaseDesignIntf::setItemPos(qreal x, qreal y) +{ + setItemPos(QPointF(x, y)); +} + +void BaseDesignIntf::setItemMode(ItemMode mode) +{ + m_itemMode = mode; + foreach(QGraphicsItem * item, childItems()) { + BaseDesignIntf *ri = dynamic_cast(item); + if (ri) ri->setItemMode(mode); + } + initMode(mode); + initFlags(); +} +void BaseDesignIntf::setItemPos(const QPointF &newPos) +{ + QPointF oldPos = pos(); + QGraphicsItem::setPos(newPos); + emit posChanged(this, newPos, oldPos); +} + +void BaseDesignIntf::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsItem::mouseReleaseEvent(event); + QRectF newGeometry = geometry(); + if (newGeometry != m_oldGeometry) { + geometryChangedEvent(newGeometry, m_oldGeometry); + updateSelectionMarker(); + emit(geometryChanged(this, newGeometry, m_oldGeometry)); + } +} + +void BaseDesignIntf::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->button() == Qt::LeftButton && + ((itemMode()&EditMode)||(itemMode()&DesignMode)) + ) { + QWidget *editor = defaultEditor(); + if (editor) { + +#if defined(WIN32) || defined(WIN64) + editor->setAttribute(Qt::WA_DeleteOnClose); + editor->setWindowFlags(Qt::Dialog); + editor->setWindowModality(Qt::ApplicationModal); + editor->show(); +#else + QDialog* dialog = new QDialog(QApplication::activeWindow()); + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->setWindowModality(Qt::WindowModal); + dialog->setLayout(new QVBoxLayout()); + dialog->resize(editor->size()); + dialog->layout()->setContentsMargins(2,2,2,2); + dialog->layout()->addWidget(editor); + connect(editor,SIGNAL(destroyed()),dialog,SLOT(close())); + dialog->exec(); +#endif + } + } + QGraphicsItem::mouseDoubleClickEvent(event); +} + +int BaseDesignIntf::posibleMoveDirectionFlags() const +{ + return m_posibleMoveDirectionFlags; +} + +void BaseDesignIntf::setPosibleMoveFlags(int directionsFlags) +{ + m_posibleMoveDirectionFlags = directionsFlags; +} + +void BaseDesignIntf::setMarginSize(int value) +{ + if (m_margin!=value){ + int oldValue = m_margin; + m_margin=value; + if (!isLoading()){ + update(rect()); + notify("margin", oldValue, value); + } + } +} + +void BaseDesignIntf::updateSelectionMarker() +{ + if (m_selectionMarker && (itemMode() & DesignMode || itemMode() & EditMode)) { + if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); + if (parentItem()) { + m_selectionMarker->setRect(rect()); + m_selectionMarker->setPos(0,0/*parentItem()->mapToScene(pos())*/); + } + } +} + +void BaseDesignIntf::drawResizeZone(QPainter *painter) +{ + + if (m_resizeAreas.count() > 0) { + painter->save(); + painter->setPen(QPen(Consts::RESIZE_ZONE_COLOR)); + (isSelected()) ? painter->setOpacity(Consts::SELECTED_RESIZE_ZONE_OPACITY) : painter->setOpacity(Consts::RESIZE_ZONE_OPACITY); + painter->setBrush(QBrush(Qt::green, Qt::SolidPattern)); + foreach(QRectF * resizeArea, m_resizeAreas) painter->drawRect(*resizeArea); + painter->restore(); + } + +} + +void BaseDesignIntf::initResizeZones() +{ + m_resizeAreas.clear(); + if (m_resizeDirectionFlags & ResizeBottom) m_resizeAreas.append(&m_bottomRect); + if (m_resizeDirectionFlags & ResizeTop) m_resizeAreas.append(&m_topRect); + if (m_resizeDirectionFlags & ResizeLeft) m_resizeAreas.append(&m_leftRect); + if (m_resizeDirectionFlags & ResizeRight) m_resizeAreas.append(&m_rightRect); +} + +void BaseDesignIntf::invalidateRect(const QRectF &rect) +{ + if (scene()) + scene()->update(mapToScene(rect).boundingRect()); +} + +ReportEnginePrivate *BaseDesignIntf::reportEditor() +{ + PageDesignIntf *page = dynamic_cast(scene()); + if (page) return page->reportEditor(); + else return 0; +} + +void BaseDesignIntf::updateItemSize(RenderPass pass, int maxHeight) +{ + Q_UNUSED(maxHeight); + m_currentPass = pass; +} + +bool BaseDesignIntf::isNeedUpdateSize(RenderPass /*pass*/) const +{return false;} + +void BaseDesignIntf::drawPinArea(QPainter *painter) const +{ + painter->drawRect(QRect(0, 0, 16, 16)); +} + +QObject *BaseDesignIntf::createElement(const QString& /*collectionName*/, const QString &elementType) +{ + BaseDesignIntf* obj = 0; + try{ + obj = LimeReport::DesignElementsFactory::instance().objectCreator(elementType)(this, this); + connect(obj,SIGNAL(propertyChanged(QString,QVariant,QVariant)),page(),SLOT(slotItemPropertyChanged(QString,QVariant,QVariant))); + } catch (ReportError error){ + qDebug()<(obj); + if (item) { + page()->registerItem(item); + } + } + } + } + emit loadCollectionFinished(collectionName); +} + +BaseDesignIntf *BaseDesignIntf::cloneItem(ItemMode mode, QObject *owner, QGraphicsItem *parent) +{ + BaseDesignIntf *clone = cloneItemWOChild(mode, owner, parent); +#ifdef HAVE_QT5 + foreach(QObject * child, children()) { +#else + foreach(QObject * child, QObject::children()) { +#endif + BaseDesignIntf *childItem = dynamic_cast(child); + if (childItem) {clone->childAddedEvent(childItem->cloneItem(mode, clone, clone));} + } + return clone; +} + +BaseDesignIntf *BaseDesignIntf::cloneItemWOChild(ItemMode mode, QObject *owner, QGraphicsItem *parent) +{ + BaseDesignIntf *clone = createSameTypeItem(owner, parent); + clone->setObjectName(this->objectName()); + clone->setItemMode(mode); + clone->objectLoadStarted(); + for (int i = 0; i < clone->metaObject()->propertyCount(); i++) { + if (clone->metaObject()->property(i).isWritable()) + clone->setProperty(clone->metaObject()->property(i).name(), property(clone->metaObject()->property(i).name())); + } + clone->objectLoadFinished(); + return clone; +} + +void BaseDesignIntf::initFromItem(BaseDesignIntf *source) +{ + objectLoadStarted(); + for (int i = 0; i < metaObject()->propertyCount(); i++) { + if (strcmp(metaObject()->property(i).name(),"objectName")!=0) + if (source->property(metaObject()->property(i).name()).isValid()) { + if (metaObject()->property(i).isWritable()) + setProperty(metaObject()->property(i).name(), source->property(metaObject()->property(i).name())); + } + } + objectLoadFinished(); +} + +bool BaseDesignIntf::canBeSplitted(int height) const +{Q_UNUSED(height); return false;} + +bool BaseDesignIntf::isEmpty() const +{return false;} + +BaseDesignIntf *BaseDesignIntf::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent) +{Q_UNUSED(height); Q_UNUSED(owner); Q_UNUSED(parent); return 0;} + +BaseDesignIntf *BaseDesignIntf::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) +{Q_UNUSED(height); Q_UNUSED(owner); Q_UNUSED(parent); return 0;} + +BaseDesignIntf *BaseDesignIntf::cloneEmpty(int height, QObject *owner, QGraphicsItem *parent) +{Q_UNUSED(height); Q_UNUSED(owner); Q_UNUSED(parent); return 0;} + + +void BaseDesignIntf::objectLoadStarted() +{ + m_objectState = ObjectLoading; +} + +void BaseDesignIntf::objectLoadFinished() +{ + m_objectState = ObjectLoaded; + emit objectLoaded(this); +} + +void BaseDesignIntf::parentObjectLoadFinished() +{} + +QList BaseDesignIntf::childBaseItems() +{ + QList resList; + foreach(QGraphicsItem * item, childItems()) { + BaseDesignIntf *baseItem = dynamic_cast(item); + if (baseItem) resList << baseItem; + } + return resList; +} + +BaseDesignIntf *BaseDesignIntf::childByName(const QString &name) +{ + foreach(BaseDesignIntf* item, childBaseItems()){ + if (item->objectName().compare(name,Qt::CaseInsensitive)==0){ + return item; + } else { + BaseDesignIntf* child = item->childByName(name); + if (child) return child; + } + } + return 0; +} + +QWidget *BaseDesignIntf::defaultEditor() +{ + return 0; +} + +void BaseDesignIntf::notify(const QString &propertyName, const QVariant& oldValue, const QVariant& newValue) +{ + if (!isLoading()) + emit propertyChanged(propertyName, oldValue, newValue); +} + +void BaseDesignIntf::notify(const QVector& propertyNames) +{ + if (!isLoading()) + emit propertyesChanged(propertyNames); +} + +SelectionMarker::SelectionMarker(QGraphicsItem *parent)//, QGraphicsScene *scene) + : QGraphicsItem(parent)//, scene) +{ +} + +QRectF SelectionMarker::boundingRect() const +{ + return m_rect; +} + +void SelectionMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + QPen pen; + pen.setColor(m_color); + pen.setWidth(2); + pen.setStyle(Qt::DashLine); + painter->setPen(pen); + painter->setOpacity(Consts::SELECTION_COLOR_OPACITY); + painter->drawRect(boundingRect()); +} + + +} + + + + + + + diff --git a/src/lrbasedesignintf.h b/src/lrbasedesignintf.h new file mode 100644 index 0000000..4bca556 --- /dev/null +++ b/src/lrbasedesignintf.h @@ -0,0 +1,333 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRBASEDESIGNINTF_H +#define LRBASEDESIGNINTF_H +#include +#include +#include +#include +#include +#include "lrcollection.h" +#include "lrglobal.h" +#include "serializators/lrstorageintf.h" + +Q_DECLARE_METATYPE(QList*) + +namespace LimeReport { + +enum ItemModes{ DesignMode=1, PreviewMode=2, PrintMode=4, EditMode=8, LayoutEditMode=16 }; + +namespace Consts { + int const RESIZE_HANDLE_SIZE = 10; + int const SELECTION_PEN_SIZE = 4; + int const MINIMUM_ITEM_WIDTH = 2*RESIZE_HANDLE_SIZE; + int const MINIMUM_ITEM_HEIGHT = 2*RESIZE_HANDLE_SIZE; + double const RESIZE_ZONE_OPACITY = 0.5; + double const SELECTED_RESIZE_ZONE_OPACITY = 0.6; + QColor const RESIZE_ZONE_COLOR = Qt::green; + QColor const SELECTION_COLOR = Qt::red; + double const SELECTION_COLOR_OPACITY = 0.9; +} + +class ReportEnginePrivate; +class PageDesignIntf; +class BaseDesignIntf; + +class SelectionMarker : public QGraphicsItem{ +public: + SelectionMarker(QGraphicsItem* parent=0);//, QGraphicsScene* scene=0); + QRectF boundingRect() const; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + void setRect(QRectF rect){prepareGeometryChange();m_rect=rect;} + void setColor(QColor color){m_color=color;} +private: + QRectF m_rect; + QColor m_color; + +}; + +class BaseDesignIntf : + public QObject, public QGraphicsItem, public ICollectionContainer, public ObjectLoadingStateIntf { + Q_OBJECT + Q_INTERFACES(QGraphicsItem) + Q_ENUMS(BGMode) + Q_ENUMS(Qt::BrushStyle) + Q_ENUMS(BrushMode) + Q_FLAGS(BorderLines) + Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometryProperty NOTIFY geometryChanged) + Q_PROPERTY(ACollectionProperty children READ fakeCollectionReader DESIGNABLE false) + Q_PROPERTY(qreal zOrder READ zValue WRITE setZValueProperty DESIGNABLE false) + Q_PROPERTY(BorderLines borders READ borderLines WRITE setBorderLinesFlags) + Q_PROPERTY(QString parentName READ parentReportItem WRITE setParentReportItem DESIGNABLE false) +public: + enum BGMode { TransparentMode,OpaqueMode}; + enum BrushMode{Solid,None}; + enum ResizeFlags { Fixed = 0, + ResizeLeft = 1, + ResizeRight = 2, + ResizeTop = 4, + ResizeBottom = 8, + AllDirections = 15 + }; + enum MoveFlags { LeftRight=1, + TopBotom=2, + All=3 + }; + enum BorderSide { TopLine = 1, + BottomLine = 2, + LeftLine = 4, + RightLine = 8 + }; + enum ObjectState {ObjectLoading, ObjectLoaded, ObjectCreated}; + Q_DECLARE_FLAGS(BorderLines, BorderSide) + Q_DECLARE_FLAGS(ItemMode,ItemModes) +public: + BaseDesignIntf(const QString& storageTypeName, QObject* owner = 0, QGraphicsItem* parent = 0); + virtual ~BaseDesignIntf(); + + void setParentReportItem(const QString& value); + QString parentReportItem(); + + BrushMode backgroundBrushMode(){return m_backgroundBrush;} + void setBackgroundBrushMode(BrushMode value); + QColor backgroundColor(){return m_backgroundBrushcolor;} + void setBackgroundColor(QColor value); + + QPen pen() const; + void setPen(QPen& pen); + QFont font() const; + void setFont(QFont& font); + QColor fontColor(){return m_fontColor;} + void setFontColor(QColor value){m_fontColor=value;} + + virtual BGMode backgroundMode() const; + virtual void setBackgroundMode(BGMode bgMode); + virtual qreal width() const; + virtual qreal widthMM() const; + virtual void setWidth(qreal width); + virtual qreal height() const; + virtual qreal heightMM() const; + virtual void setHeight(qreal height); + virtual QPointF posMM() const; + virtual int opacity() const; + virtual void setOpacity(int opacity); + virtual void setSize(QSizeF size); + virtual QSizeF size() const; + virtual QSizeF sizeMM() const; + + void paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget); + void prepareRect(QPainter* ppainter, const QStyleOptionGraphicsItem*, QWidget*); + virtual QPainterPath shape() const; + + void setFixedPos(bool fixedPos); + int resizeHandleSize() const; + + void setMMFactor(qreal mmFactor); + qreal mmFactor() const; + virtual QRectF geometry() const; + void setGeometry(QRectF rect); + + QRectF rect()const; + void setupPainter(QPainter* painter) const; + virtual QRectF boundingRect() const; + + virtual void moveRight(); + virtual void moveLeft(); + virtual void moveDown(); + virtual void moveUp(); + + virtual void sizeRight(); + virtual void sizeLeft(); + virtual void sizeUp(); + virtual void sizeDown(); + + void setItemPos(const QPointF &newPos); + void setItemPos(qreal x, qreal y); + + void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); + ItemMode itemMode() const {return m_itemMode;} + + void setBorderLinesFlags(LimeReport::BaseDesignIntf::BorderLines flags); + void setGeometryProperty(QRectF rect); + PageDesignIntf* page(); + + BorderLines borderLines() const; + QString storageTypeName() const {return m_storageTypeName;} + ReportEnginePrivate *reportEditor(); + + virtual void updateItemSize(RenderPass pass=FirstPass,int maxHeight=0); + virtual bool isNeedUpdateSize(RenderPass) const; + virtual BaseDesignIntf* cloneItem(LimeReport::BaseDesignIntf::ItemMode mode, QObject* owner=0, QGraphicsItem* parent=0); + virtual BaseDesignIntf* cloneItemWOChild(LimeReport::BaseDesignIntf::ItemMode mode, QObject* owner=0, QGraphicsItem* parent=0); + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0) = 0; + void initFromItem(BaseDesignIntf* source); + + virtual bool canBeSplitted(int height) const; + virtual qreal minHeight() const {return 0;} + virtual bool isSplittable() const {return false;} + virtual bool isEmpty() const; + virtual BaseDesignIntf* cloneUpperPart(int height, QObject* owner=0, QGraphicsItem* parent=0); + virtual BaseDesignIntf* cloneBottomPart(int height, QObject* owner=0, QGraphicsItem* parent=0); + virtual BaseDesignIntf* cloneEmpty(int height, QObject* owner=0, QGraphicsItem* parent=0); + + bool isLoaded(){return m_objectState==ObjectLoaded;} + bool isLoading(){return m_objectState==ObjectLoading;} + void objectLoadStarted(); + void objectLoadFinished(); + virtual void parentObjectLoadFinished(); + virtual void beforeDelete(); + + + QList childBaseItems(); + BaseDesignIntf* childByName(const QString& name); + + virtual QWidget *defaultEditor(); + void notify(const QString &propertyName, const QVariant &oldValue, const QVariant &newValue); + void notify(const QVector &propertyNames); + + int posibleResizeDirectionFlags() const; + void setPosibleResizeDirectionFlags(int directionsFlags); + int posibleMoveDirectionFlags() const; + void setPosibleMoveFlags(int directionsFlags); + + int marginSize() const {return m_margin;} + void setMarginSize(int value); + + QString itemTypeName() const; + void setItemTypeName(const QString &itemTypeName); + void emitObjectNamePropertyChanged(const QString& oldName, const QString& newName); +protected: + + //ICollectionContainer + QObject* createElement(const QString&, const QString& elementType); + int elementsCount(const QString&); + QObject* elementAt(const QString&, int index); + void collectionLoadFinished(const QString& collectionName); + //ICollectionContainer + + void mousePressEvent(QGraphicsSceneMouseEvent* event); + void hoverMoveEvent(QGraphicsSceneHoverEvent* event); + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + //void virtual hoverEnterEvent(QGraphicsSceneHoverEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent* event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); + + virtual void geometryChangedEvent(QRectF newRect, QRectF oldRect); + virtual QPen borderPen(BorderSide side) const; + virtual QColor selectionColor() const; + virtual void initFlags(); + virtual void initMode(LimeReport::BaseDesignIntf::ItemMode mode); + virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); + virtual void childAddedEvent(BaseDesignIntf* child); + + void drawTopLine(QPainter *painter, QRectF rect) const; + void drawBootomLine(QPainter *painter, QRectF rect) const; + void drawRightLine(QPainter *painter, QRectF rect) const; + void drawLeftLine(QPainter *painter, QRectF rect) const; + + void drawBorder(QPainter* painter, QRectF rect) const; + void drawDesignModeBorder(QPainter* painter, QRectF rect) const; + void drawRenderModeBorder(QPainter *painter, QRectF rect) const; + void drawResizeZone(QPainter *painter); + void drawSelection(QPainter* painter, QRectF) const; + void drawPinArea(QPainter* painter) const; + + void initResizeZones(); + void invalidateRect(const QRectF &rect); + void invalidateRects(QVector rects); + QFont transformToSceneFont(const QFont &value) const; + + RenderPass currentRenderPass(){return m_currentPass;} + +private: + void updateSelectionMarker(); + int resizeDirectionFlags(QPointF position); + void moveSelectedItems(QPointF delta); + Qt::CursorShape getPosibleCursor(int cursorFlags); + void setZValueProperty(qreal value); +private slots: +// void slotObjectNameChanged(const QString& newName); +private: + QPointF m_startPos; + QPointF m_startScenePos; + int m_resizeHandleSize; + int m_selectionPenSize; + int m_posibleResizeDirectionFlags; + int m_posibleMoveDirectionFlags; + int m_resizeDirectionFlags; + qreal m_width, m_height; + QPen m_pen; + QFont m_font; + QColor m_fontColor; + qreal m_mmFactor; + bool m_fixedPos; + + QRectF m_rect; + mutable QRectF m_boundingRect; + + QRectF m_oldGeometry; + BGMode m_BGMode; + int m_opacity; + BorderLines m_borderLinesFlags; + + QRectF m_bottomRect; + QRectF m_topRect; + QRectF m_leftRect; + QRectF m_rightRect; + + QVector m_resizeAreas; + QFrame* m_hintFrame; + QString m_storageTypeName; + ItemMode m_itemMode; + + ObjectState m_objectState; + SelectionMarker* m_selectionMarker; + + BrushMode m_backgroundBrush; + QColor m_backgroundBrushcolor; + RenderPass m_currentPass; + int m_margin; + QString m_itemTypeName; +signals: + void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); + void posChanged(QObject* object, QPointF newPos, QPointF oldPos); + void itemSelected(LimeReport::BaseDesignIntf *item); + void loadCollectionFinished(const QString& collectionName); + void objectLoaded(QObject* object); + void objectChanged(QObject* object); + void propertyChanged(const QString& propertName, const QVariant& oldValue,const QVariant& newValue); + void propertyObjectNameChanged(const QString& oldValue, const QString& newValue); + void propertyesChanged(QVector propertyNames); +}; + +} //namespace LimeReport + +#endif // LRBASEDESIGNINTF_H diff --git a/src/lrcallbackdatasourceintf.h b/src/lrcallbackdatasourceintf.h new file mode 100644 index 0000000..3259f4b --- /dev/null +++ b/src/lrcallbackdatasourceintf.h @@ -0,0 +1,24 @@ +#ifndef LRVIRTUALDATASOURCEINTF +#define LRVIRTUALDATASOURCEINTF +#include +namespace LimeReport { + +struct CallbackInfo{ + enum DataType{IsEmpty, HasNext, ColumnHeaderData, ColumnData}; + enum ChangePosType{First, Next}; + DataType dataType; + int index; + QString columnName; +}; + +class ICallbackDatasource :public QObject{ + Q_OBJECT +signals: + void getCallbackData(const LimeReport::CallbackInfo& info, QVariant& data); + void changePos(const LimeReport::CallbackInfo::ChangePosType& type, bool& result); +}; + +} + +#endif // LRVIRTUALDATASOURCEINTF + diff --git a/src/lrcollection.h b/src/lrcollection.h new file mode 100644 index 0000000..0422c28 --- /dev/null +++ b/src/lrcollection.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRCOLLECTION_H +#define LRCOLLECTION_H + +#include +#include + +class ACollectionProperty{ +public: + ACollectionProperty(){} + ACollectionProperty(const ACollectionProperty& ){} + virtual ~ACollectionProperty(){} +}; +Q_DECLARE_METATYPE(ACollectionProperty) + +namespace LimeReport{ + +const int COLLECTION_TYPE_ID = qMetaTypeId(); +class ICollectionContainer{ +public: + virtual QObject* createElement(const QString& collectionName,const QString& elementType)=0; + virtual int elementsCount(const QString& collectionName)=0; + virtual QObject* elementAt(const QString& collectionName,int index)=0; + virtual void collectionLoadFinished(const QString& collectionName){Q_UNUSED(collectionName)} + ACollectionProperty fakeCollectionReader(){return ACollectionProperty();} +}; + +} +#endif // LRCOLLECTION_H diff --git a/src/lrdatadesignintf.cpp b/src/lrdatadesignintf.cpp new file mode 100644 index 0000000..c78b249 --- /dev/null +++ b/src/lrdatadesignintf.cpp @@ -0,0 +1,583 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrdatadesignintf.h" + +#include +#include +#include +#include +#include +#include "lrdatasourcemanager.h" + +namespace LimeReport{ + +ModelHolder::ModelHolder(QAbstractItemModel *model, bool owned /*false*/) +{ + ModelToDataSource* mh = new ModelToDataSource(model,owned); + m_dataSource = mh; + m_owned=owned; + connect(mh, SIGNAL(modelStateChanged()), this, SIGNAL(modelStateChanged())); +} + +ModelHolder::~ModelHolder(){ + delete m_dataSource; +} + +IDataSource * ModelHolder::dataSource(IDataSource::DatasourceMode mode) +{ + Q_UNUSED(mode); + return m_dataSource; +} + +QueryHolder::QueryHolder(QString queryText, QString connectionName) + : m_query(0), m_queryText(queryText), m_connectionName(connectionName), m_mode(IDataSource::RENDER_MODE) +{ + extractParams(); +} + +QueryHolder::~QueryHolder() +{ + if (m_query) delete m_query; +} + +bool QueryHolder::runQuery(IDataSource::DatasourceMode mode) +{ + m_mode = mode; + QSqlDatabase db = QSqlDatabase::database(m_connectionName); + if (!db.isValid()) { + setLastError(QObject::tr("Invalid connection! %1").arg(m_connectionName)); + return false; + } + + if (!m_query){ + m_query = new QSqlQuery(db); + m_query->prepare(m_preparedSQL); + } + + fillParams(m_query); + m_query->exec(); + + QSqlQueryModel *model = new QSqlQueryModel; + model->setQuery(*m_query); + + while (model->canFetchMore()) + model->fetchMore(); + + if (model->lastError().isValid()){ + if (m_dataSource) + m_dataSource.clear(); + setLastError(model->lastError().text()); + delete model; + return false; + } else setLastError(""); + + setDatasource(IDataSource::Ptr(new ModelToDataSource(model,true))); + return true; +} + +QString QueryHolder::connectionName() +{ + return m_connectionName; +} + +void QueryHolder::setConnectionName(QString connectionName) +{ + m_connectionName=connectionName; +} + +void QueryHolder::setDatasource(IDataSource::Ptr value){ + m_dataSource.clear(); + m_dataSource=value; +} + +void QueryHolder::fillParams(QSqlQuery *query) +{ + DataSourceManager* dm=DataSourceManager::instance(); + foreach(QString param,m_params){ + QVariant value; + if (param.contains(".")){ + value = dm->fieldData(param); + param=param.right(param.length()-param.indexOf('.')-1); + } else { + value = dm->variable(param); + } + if (value.isValid() || m_mode == IDataSource::DESIGN_MODE) + query->bindValue(':'+param,value); + } +} + +void QueryHolder::extractParams() +{ + m_preparedSQL = replaceVriables(m_queryText); +} + +QString QueryHolder::replaceVriables(QString query) +{ + QRegExp rx(VARIABLE_RX); + if (query.contains(rx)){ + while ((rx.indexIn(query))!=-1){ + QString variable=rx.cap(0); + variable.remove("$V{"); + variable.remove("}"); + m_params.append(variable); + query.replace(rx.cap(0),":"+variable); + } + } + return query; +} + +QString QueryHolder::queryText() +{ + return m_queryText; +} + +void QueryHolder::setQueryText(QString queryText) +{ + m_queryText=queryText; +} + +IDataSource* QueryHolder::dataSource(IDataSource::DatasourceMode mode) +{ + if ((m_mode != mode && m_mode == IDataSource::DESIGN_MODE) || m_dataSource==0) { + m_mode = mode; + runQuery(mode); + } + if (m_dataSource) + return m_dataSource.data(); + else return 0; +} + +// QueryHolder + +// ModelToDataSource + +ModelToDataSource::ModelToDataSource(QAbstractItemModel* model, bool owned) + : QObject(), m_model(model), m_owned(owned), m_curRow(-1), m_lastError("") +{ + Q_ASSERT(model); + if (model){ + while (model->canFetchMore(QModelIndex())) + model->fetchMore(QModelIndex()); + connect(model, SIGNAL(destroyed()), this, SLOT(slotModelDestroed())); + connect(model, SIGNAL(modelReset()), this, SIGNAL(modelStateChanged())); + } +} + +ModelToDataSource::~ModelToDataSource() +{ + if ((m_owned) && m_model!=0) + delete m_model; +} + +bool ModelToDataSource::next() +{ + if (isInvalid()) return false; + if (m_curRow<(m_model->rowCount())) { + if (bof()) m_curRow++; + m_curRow++; + return true; + } else return false; +} + +bool ModelToDataSource::hasNext() +{ + if (isInvalid()) return false; + return m_curRowrowCount()-1; +} + +bool ModelToDataSource::prior() +{ + if (isInvalid()) return false; + if (m_curRow>-1){ + if (eof()) m_curRow--; + m_curRow--; + return true; + } else return false; +} + +void ModelToDataSource::first() +{ + m_curRow=0; +} + +void ModelToDataSource::last() +{ + if (isInvalid()) m_curRow=0; + else m_curRow=m_model->rowCount()-1; +} + +bool ModelToDataSource::eof() +{ + if (isInvalid()) return true; + return (m_curRow==m_model->rowCount())||(m_model->rowCount()==0); +} + +bool ModelToDataSource::bof() +{ + if (isInvalid()) return true; + return (m_curRow==-1)||(m_model->rowCount()==0); +} + +QVariant ModelToDataSource::data(const QString &columnName) +{ + if (isInvalid()) return QVariant(); + return m_model->data(m_model->index(currentRow(),columnIndexByName(columnName))); +} + +int ModelToDataSource::columnCount() +{ + if (isInvalid()) return 0; + return m_model->columnCount(); +} + +QString ModelToDataSource::columnNameByIndex(int columnIndex) +{ + if (isInvalid()) return ""; + return m_model->headerData(columnIndex,Qt::Horizontal).toString(); +} + +int ModelToDataSource::columnIndexByName(QString name) +{ + if (isInvalid()) return 0; + for(int i=0;icolumnCount();i++){ + if (m_model->headerData(i,Qt::Horizontal).toString().compare(name,Qt::CaseInsensitive)==0) + return i; + } + return -1; +} + +QString ModelToDataSource::lastError() +{ + return m_lastError; +} + +QAbstractItemModel * ModelToDataSource::model() +{ + return m_model; +} + +int ModelToDataSource::currentRow() +{ + if (eof()) return m_curRow-1; + if (bof()) return m_curRow+1; + return m_curRow; +} + +bool ModelToDataSource::isInvalid() const +{ + return m_model==0; +} + +void ModelToDataSource::slotModelDestroed() +{ + m_model = 0; + m_lastError = tr("model is destroyed"); + emit modelStateChanged(); +} + +ConnectionDesc::ConnectionDesc(QSqlDatabase db, QObject *parent) + : QObject(parent), m_connectionName(db.connectionName()), m_connectionHost(db.hostName()), m_connectionDriver(db.driverName()), + m_databaseName(db.databaseName()), m_user(db.userName()), m_password(db.password()) +{} + +ConnectionDesc::ConnectionDesc(QObject *parent) + :QObject(parent),m_connectionName(""),m_connectionHost(""),m_connectionDriver(""), + m_databaseName(""), m_user(""), m_password(""), m_autoconnect(false) +{} + +ConnectionDesc::Ptr ConnectionDesc::create(QSqlDatabase db, QObject *parent) +{ + return Ptr(new ConnectionDesc(db,parent)); +} + +void ConnectionDesc::setName(const QString &value) +{ + if (m_connectionName!=value) emit nameChanged(m_connectionName,value); + m_connectionName=value; +} + +QueryDesc::QueryDesc(QString queryName, QString queryText, QString connection) + :m_queryName(queryName), m_query(queryText), m_connectionName(connection) +{} + +SubQueryHolder::SubQueryHolder(QString queryText, QString connectionName, QString masterDatasource) + : QueryHolder(queryText,connectionName), m_masterDatasource(masterDatasource), m_invalid(false) +{ + extractParams(); +} + +void SubQueryHolder::setMasterDatasource(const QString &value) +{ + DataSourceManager* dm = DataSourceManager::instance(); + if (dm->dataSource(value)){ + m_masterDatasource = value; + m_invalid = false; + } +} + +void SubQueryHolder::extractParams() +{ + m_preparedSQL = replaceFields(replaceVriables(queryText())); +} + +QString SubQueryHolder::extractField(QString source) +{ + if (source.contains('.')) { + return source.right(source.length()-(source.indexOf('.')+1)); + } + return source; +} + +QString SubQueryHolder::replaceFields(QString query) +{ + QRegExp rx(FIELD_RX); + if (query.contains(rx)){ + while ((rx.indexIn(query))!=-1){ + QString field=rx.cap(0); + field.remove("$D{"); + field.remove("}"); + if (field.contains(".")) + m_params.append(field); + else + m_params.append(m_masterDatasource+"."+field); + query.replace(rx.cap(0),":"+extractField(field)); + } + } + return query; +} + +SubQueryDesc::SubQueryDesc(QString queryName, QString queryText, QString connection, QString masterDatasourceName) + :QueryDesc(queryName,queryText,connection), m_masterDatasourceName(masterDatasourceName) +{ +} + +QObject *ProxyDesc::createElement(const QString &collectionName, const QString &) +{ + if (collectionName=="fields"){ + FieldMapDesc* fieldMapDesc = new FieldMapDesc; + m_maps.append(fieldMapDesc); + return fieldMapDesc; + } + return 0; +} + +int ProxyDesc::elementsCount(const QString &collectionName) +{ + Q_UNUSED(collectionName) + return m_maps.count(); +} + +QObject *ProxyDesc::elementAt(const QString &collectionName, int index) +{ + Q_UNUSED(collectionName) + return m_maps.at(index); +} + +ProxyHolder::ProxyHolder(ProxyDesc* desc) + :m_desc(desc), m_lastError(""), m_mode(IDataSource::RENDER_MODE), m_invalid(false) +{} + +QString ProxyHolder::masterDatasource() +{ + if (m_desc) return m_desc->master(); + return QString(); +} + +void ProxyHolder::filterModel() +{ + if (!m_datasource){ + DataSourceManager* dm=DataSourceManager::instance(); + if (dm){ + IDataSource* master = dm->dataSource(m_desc->master()); + IDataSource* child = dm->dataSource(m_desc->child()); + if (master&&child){ + m_model = new MasterDetailProxyModel(); + connect(child->model(),SIGNAL(destroyed()), this, SLOT(slotChildModelDestoroyed())); + m_model->setSourceModel(child->model()); + m_model->setMaster(m_desc->master()); + m_model->setChildName(m_desc->child()); + m_model->setFieldsMap(m_desc->fieldsMap()); + try{ + m_model->rowCount(); + m_datasource = IDataSource::Ptr(new ModelToDataSource(m_model,true)); + } catch (ReportError& exception) { + m_lastError = exception.what(); + } + } else { + m_lastError.clear(); + if(!master) m_lastError+=QObject::tr("Master datasouce \"%1\" not found!").arg(m_desc->master()); + if(!child) m_lastError+=((m_lastError.isEmpty())?QObject::tr("Child"):QObject::tr(" and child "))+ + QObject::tr("datasouce \"%1\" not found!").arg(m_desc->child()); + } + } + } else { + if (!isInvalid()){ + m_model->invalidate(); + m_datasource->first(); + } + } +} + +IDataSource *ProxyHolder::dataSource(IDataSource::DatasourceMode mode) +{ + if ((m_mode != mode && m_mode == IDataSource::DESIGN_MODE) || m_datasource==0) { + m_mode = mode; + m_datasource.clear(); + filterModel(); + } + return m_datasource.data(); +} + +void ProxyDesc::addFieldsCorrelation(const FieldsCorrelation& fieldsCorrelation) +{ + m_maps.append(new FieldMapDesc(fieldsCorrelation)); +} + +void MasterDetailProxyModel::setMaster(QString name){ + m_masterName=name; +} + +bool MasterDetailProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const +{ + Q_UNUSED(source_parent) + foreach (FieldMapDesc* fieldCorrelation, *m_maps) { + QVariant master = masterData(fieldCorrelation->master()); + QVariant detail = sourceData(fieldCorrelation->detail(),source_row); + if (master==detail) + return true; + } + return false; +} + +int MasterDetailProxyModel::fieldIndexByName(QString fieldName) const +{ + for(int i=0;icolumnCount();++i){ + if (sourceModel()->headerData(i,Qt::Horizontal).toString().compare(fieldName,Qt::CaseInsensitive)==0){ + return i; + } + } + return -1; +} + +QVariant MasterDetailProxyModel::sourceData(QString fieldName, int row) const +{ + int fieldIndex = fieldIndexByName(fieldName); + if (fieldIndex!=-1){ + return sourceModel()->index(row,fieldIndex).data(); + } else { + throw ReportError( + tr("Field: \"%1\" not found in \"%2\" child datasource").arg(fieldName).arg(m_childName) + ); + } +} + +QVariant MasterDetailProxyModel::masterData(QString fieldName) const +{ + IDataSource* master = DataSourceManager::instance()->dataSource(m_masterName); + int columnIndex = master->columnIndexByName(fieldName); + if (columnIndex!=-1){ + return master->data(fieldName); + } else { + throw ReportError( + tr("Field: \"%1\" not found in \"%2\" master datasource").arg(fieldName).arg(m_masterName) + ); + } +} + +bool CallbackDatasource::next(){ + if (!m_eof){ + m_currentRow++; + bool result = false; + emit changePos(CallbackInfo::Next,result); + m_eof = !checkNextRecord(m_currentRow); + return result; + } else return false; +} + +void CallbackDatasource::first(){ + m_currentRow = 0; + m_eof=checkIfEmpty(); + bool result=false; + emit changePos(CallbackInfo::First,result); + m_eof = !result; +} + +QVariant CallbackDatasource::data(const QString& columnName) +{ + CallbackInfo info; + info.dataType = CallbackInfo::ColumnData; + info.columnName = columnName; + info.index = m_currentRow; + QVariant result; + emit getCallbackData(info,result); + return result; +} + +int CallbackDatasource::columnCount(){ + if (m_headers.size()==0){ + int currIndex = 0; + do { + QVariant columnName; + CallbackInfo info; + info.dataType = CallbackInfo::ColumnHeaderData; + info.index = currIndex; + emit getCallbackData(info,columnName); + if (columnName.isValid()){ + m_headers.append(columnName.toString()); + currIndex++; + } else break; + } while (true); + } + return m_headers.size(); +} + +QString CallbackDatasource::columnNameByIndex(int columnIndex) +{ + if (columnIndex < m_headers.size()) + return m_headers[columnIndex]; + else return QString(); +} + +int CallbackDatasource::columnIndexByName(QString name) +{ + for (int i=0;i. * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATADESIGNINTF_H +#define LRDATADESIGNINTF_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "lrcollection.h" +#include "lrcallbackdatasourceintf.h" + +namespace LimeReport{ + +class IDataSource { +public: + enum DatasourceMode{DESIGN_MODE,RENDER_MODE}; + typedef QSharedPointer Ptr; + virtual ~IDataSource(){} + virtual bool next() = 0; + virtual bool hasNext() = 0; + virtual bool prior() = 0; + virtual void first() = 0; + virtual void last() = 0; + virtual bool bof() = 0; + virtual bool eof() = 0; + virtual QVariant data(const QString& columnName) = 0; + virtual int columnCount() = 0; + virtual QString columnNameByIndex(int columnIndex) = 0; + virtual int columnIndexByName(QString name) = 0; + virtual bool isInvalid() const = 0; + virtual QString lastError() = 0; + virtual QAbstractItemModel* model() = 0; +}; + +class IDataSourceHolder { +public: + virtual IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE) = 0; + virtual QString lastError() const = 0; + virtual bool isInvalid() const = 0; + virtual bool isOwned() const = 0; + virtual bool isEditable() const = 0; + virtual bool isRemovable() const = 0; + virtual void invalidate() = 0; + virtual ~IDataSourceHolder(){} +}; + +class ModelHolder: public QObject, public IDataSourceHolder{ + Q_OBJECT +public: + ModelHolder(QAbstractItemModel* model, bool owned=false); + ~ModelHolder(); + IDataSource* dataSource(IDataSource::DatasourceMode mode); + bool isOwned() const { return m_owned; } + bool isInvalid() const { return m_dataSource->isInvalid(); } + QString lastError() const { return m_dataSource->lastError(); } + bool isEditable() const { return false; } + bool isRemovable() const { return false; } + void invalidate(){} +signals: + void modelStateChanged(); +private: + IDataSource* m_dataSource; + bool m_owned; +}; + +class ConnectionDesc : public QObject{ + Q_OBJECT + Q_PROPERTY(QString name READ name WRITE setName ) + Q_PROPERTY(QString driver READ driver WRITE setDriver) + Q_PROPERTY(QString databaseName READ databaseName WRITE setDatabaseName) + Q_PROPERTY(QString userName READ userName WRITE setUserName) + Q_PROPERTY(QString password READ password WRITE setPassword) + Q_PROPERTY(QString host READ host WRITE setHost) + Q_PROPERTY(bool autoconnect READ autoconnect WRITE setAutoconnect) +public: + typedef QSharedPointer Ptr; + ConnectionDesc(QSqlDatabase db, QObject* parent=0); + ConnectionDesc(QObject* parent=0); + Ptr create(QSqlDatabase db, QObject* parent=0); + void setName(const QString &value); + QString name(){return m_connectionName;} + void setDriver(const QString &value){m_connectionDriver=value;} + QString driver(){return m_connectionDriver;} + void setHost(const QString &value){m_connectionHost=value;} + QString host(){return m_connectionHost;} + void setDatabaseName(const QString &value){m_databaseName=value;} + QString databaseName(){return m_databaseName;} + void setUserName(const QString &value){m_user=value;} + QString userName(){return m_user;} + void setPassword(const QString &value){m_password=value;} + QString password(){return m_password;} + void setAutoconnect(bool value){m_autoconnect=value;} + bool autoconnect(){return m_autoconnect;} +signals: + void nameChanged(const QString& oldName,const QString& newName); +private: + QString m_connectionName; + QString m_connectionHost; + QString m_connectionDriver; + QString m_databaseName; + QString m_user; + QString m_password; + bool m_autoconnect; +}; + +class IConnectionController{ +public: + virtual void addConnectionDesc(ConnectionDesc* connection) = 0; + virtual void changeConnectionDesc(ConnectionDesc* connection) = 0; +}; + +class QueryDesc : public QObject{ + Q_OBJECT + Q_PROPERTY(QString queryName READ queryName WRITE setQueryName) + Q_PROPERTY(QString queryText READ queryText WRITE setQueryText) + Q_PROPERTY(QString connectionName READ connectionName WRITE setConnectionName) +public: + QueryDesc(QString queryName, QString queryText, QString connection); + explicit QueryDesc(QObject* parent=0):QObject(parent){} + void setQueryName(QString value){m_queryName=value;} + QString queryName(){return m_queryName;} + void setQueryText(QString value){m_query=value;} + QString queryText(){return m_query;} + void setConnectionName(QString value){m_connectionName=value;} + QString connectionName(){return m_connectionName;} +private: + QString m_queryName; + QString m_query; + QString m_connectionName; +}; + +class QueryHolder:public IDataSourceHolder{ +public: + QueryHolder(QString queryText, QString connectionName); + ~QueryHolder(); + virtual bool runQuery(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE); + IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE); + QString connectionName(); + QString queryText(); + void setQueryText(QString queryText); + void setConnectionName(QString connectionName); + bool isOwned() const { return true; } + bool isInvalid() const { return !m_lastError.isEmpty(); } + bool isEditable() const { return true; } + bool isRemovable() const { return true; } + QString lastError() const { return m_lastError; } + void setLastError(QString value){m_lastError=value; if (m_query) {delete m_query; m_query=0;}} + void invalidate(){} +protected: + void setDatasource(IDataSource::Ptr value); + virtual void fillParams(QSqlQuery* query); + virtual void extractParams(); + QString replaceVriables(QString query); + QList m_params; + QSqlQuery* m_query; + QString m_preparedSQL; +private: + QString m_queryText; + QString m_connectionName; + QString m_lastError; + IDataSource::Ptr m_dataSource; + IDataSource::DatasourceMode m_mode; +}; + +class SubQueryDesc : public QueryDesc{ + Q_OBJECT + Q_PROPERTY(QString master READ master WRITE setMaster) +public: + SubQueryDesc(QString queryName, QString queryText, QString connection, QString master); + explicit SubQueryDesc(QObject* parent=0):QueryDesc(parent){} + void setMaster(QString value){m_masterDatasourceName=value;} + QString master(){return m_masterDatasourceName;} +private: + QString m_masterDatasourceName; +}; + +class SubQueryHolder:public QueryHolder{ +public: + SubQueryHolder(QString queryText, QString connectionName, QString masterDatasource); + QString masterDatasource(){return m_masterDatasource;} + void setMasterDatasource(const QString& value); + void invalidate(){m_invalid = true;} + bool isInvalid() const{ return QueryHolder::isInvalid() || m_invalid;} +protected: + void extractParams(); + QString extractField(QString source); + QString replaceFields(QString query); +private: + QString m_masterDatasource; + bool m_invalid; +}; + +struct FieldsCorrelation{ + QString master; + QString detail; +}; + +class FieldMapDesc : public QObject{ + Q_OBJECT + Q_PROPERTY(QString master READ master WRITE setMaster) + Q_PROPERTY(QString detail READ detail WRITE setDetail) +public: + FieldMapDesc(){} + FieldMapDesc(FieldsCorrelation correlation):m_fieldsCorrelation(correlation){} + QString master(){return m_fieldsCorrelation.master;} + void setMaster(QString value){m_fieldsCorrelation.master=value;} + QString detail(){return m_fieldsCorrelation.detail;} + void setDetail(QString value){m_fieldsCorrelation.detail=value;} +private: + FieldsCorrelation m_fieldsCorrelation; +}; + +class ProxyDesc : public QObject, public ICollectionContainer{ + Q_OBJECT + Q_PROPERTY(ACollectionProperty fields READ fakeCollectionReader) + Q_PROPERTY(QString master READ master WRITE setMaster) + Q_PROPERTY(QString child READ child WRITE setDetail) + Q_PROPERTY(QString name READ name WRITE setName) +public: + void setMaster(QString value){m_master=value;} + QString master(){return m_master;} + void setDetail(QString value){m_detail=value;} + QString child(){return m_detail;} + QString name(){return m_name;} + void setName(QString value){m_name=value;} + void addFieldsCorrelation(const FieldsCorrelation &fieldsCorrelation); + QList* fieldsMap(){return &m_maps;} + //ICollectionContainer + virtual QObject* createElement(const QString& collectionName,const QString&); + virtual int elementsCount(const QString& collectionName); + virtual QObject *elementAt(const QString& collectionName,int index); +private: + QList m_maps; + QString m_master; + QString m_detail; + QString m_name; +}; + +class MasterDetailProxyModel : public QSortFilterProxyModel{ +public: + MasterDetailProxyModel():m_maps(0){} + void setMaster(QString name); + void setChildName(QString name){m_childName=name;} + void setFieldsMap(QList *fieldsMap){m_maps=fieldsMap;} +protected: + bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; + int fieldIndexByName(QString fieldName) const; + QVariant sourceData(QString fieldName, int row) const; + QVariant masterData(QString fieldName) const; +private: + QList* m_maps; + QString m_masterName; + QString m_childName; + +}; + +class ProxyHolder: public QObject, public IDataSourceHolder{ + Q_OBJECT +public: + ProxyHolder(ProxyDesc *desc); + QString masterDatasource(); + void filterModel(); + IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE); + bool isOwned() const { return true; } + bool isInvalid() const { return !m_lastError.isEmpty() || m_invalid; } + bool isEditable() const { return true; } + bool isRemovable() const { return true; } + QString lastError() const { return m_lastError; } + void invalidate(){m_invalid = true; m_lastError = tr("Datasource has been invalidated");} +private slots: + void slotChildModelDestoroyed(){m_datasource.clear();} +private: + IDataSource::Ptr m_datasource; + MasterDetailProxyModel *m_model; + ProxyDesc *m_desc; + QString m_lastError; + IDataSource::DatasourceMode m_mode; + bool m_invalid; +}; + +class ModelToDataSource : public QObject, public IDataSource{ + Q_OBJECT +public: + ModelToDataSource(QAbstractItemModel* model, bool owned); + ~ModelToDataSource(); + bool next(); + bool hasNext(); + bool prior(); + void first(); + void last(); + bool eof(); + bool bof(); + QVariant data(const QString& columnName); + int columnCount(); + QString columnNameByIndex(int columnIndex); + int columnIndexByName(QString name); + QString lastError(); + virtual QAbstractItemModel* model(); + int currentRow(); + bool isInvalid() const; +signals: + void modelStateChanged(); +private slots: + void slotModelDestroed(); +private: + QAbstractItemModel* m_model; + bool m_owned; + int m_curRow; + QString m_lastError; +}; + +class CallbackDatasource :public ICallbackDatasource, public IDataSource { + Q_OBJECT +public: + CallbackDatasource(): m_currentRow(-1), m_eof(false){} + bool next(); + bool hasNext(){ return !m_eof;} + bool prior(){ if (m_currentRow !=-1) {m_currentRow--; return true;} else return false;} + void first(); + void last(){} + bool bof(){return m_currentRow == -1;} + bool eof(){return m_eof;} + QVariant data(const QString &columnName); + int columnCount(); + QString columnNameByIndex(int columnIndex); + int columnIndexByName(QString name); + bool isInvalid() const{ return false;} + QString lastError(){ return "";} + QAbstractItemModel *model(){return 0;} +private: + bool checkNextRecord(int recordNum){ + QVariant result = false; + CallbackInfo info; + info.dataType = CallbackInfo::HasNext; + info.index = recordNum; + emit getCallbackData(info,result); + return result.toBool(); + } + bool checkIfEmpty(){ + QVariant result = true; + CallbackInfo info; + info.dataType = CallbackInfo::IsEmpty; + emit getCallbackData(info,result); + //emit getIsEmpty(result); + return result.toBool(); + } +private: + QVector m_headers; + int m_currentRow; + bool m_eof; +}; + +class CallbackDatasourceHolder :public QObject, public IDataSourceHolder{ + Q_OBJECT + // IDataSourceHolder interface +public: + CallbackDatasourceHolder(IDataSource* datasource, bool owned):m_owned(owned){ m_datasource = datasource;} + IDataSource *dataSource(IDataSource::DatasourceMode){ return m_datasource;} + QString lastError() const{ return m_datasource->lastError();} + bool isInvalid() const {return m_datasource->isInvalid();} + bool isOwned() const {return m_owned;} + bool isEditable() const {return false;} + bool isRemovable() const {return false;} + void invalidate(){} + ~CallbackDatasourceHolder(){if (m_datasource) delete m_datasource;} +private: + IDataSource* m_datasource; + bool m_owned; +}; + +} +#endif // LRDATADESIGNINTF_H diff --git a/src/lrdatasourcemanager.cpp b/src/lrdatasourcemanager.cpp new file mode 100644 index 0000000..1db8034 --- /dev/null +++ b/src/lrdatasourcemanager.cpp @@ -0,0 +1,1035 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrdatasourcemanager.h" +#include "lrdatadesignintf.h" +#include +#include +#include +#include +#include + +namespace LimeReport{ + +DataNode::~DataNode() +{ + for (int i = 0; im_childs.indexOf(const_cast(this)); + } + return 0; +} + +void DataNode::clear() +{ + for (int i=0; ichild(row); + if (childNode){ + return createIndex(row,column,childNode); + } else return QModelIndex(); +} + +QModelIndex DataSourceModel::parent(const QModelIndex& child) const +{ + if (!child.isValid()) return QModelIndex(); + + DataNode* childNode = nodeFromIndex(child); + if (!childNode) return QModelIndex(); + + DataNode* parentNode = childNode->parent(); + if ((parentNode == m_rootNode) || (!parentNode)) return QModelIndex(); + return createIndex(parentNode->row(),0,parentNode); +} + +int DataSourceModel::rowCount(const QModelIndex& parent) const +{ + if (!m_rootNode) return 0; + DataNode* parentNode; + if (parent.isValid()) + parentNode = nodeFromIndex(parent); + else + parentNode = m_rootNode; + return parentNode->childCount(); +} + +int DataSourceModel::columnCount(const QModelIndex& parent) const +{ + Q_UNUSED(parent) + return 1; +} + +QVariant DataSourceModel::data(const QModelIndex& index, int role) const +{ + DataNode *node = nodeFromIndex(index); + switch (role) { + case Qt::DisplayRole: + if (!node) return QVariant(); + return node->name(); + break; + case Qt::DecorationRole : + if (!node) return QIcon(); + return node->icon(); + break; + default: + return QVariant(); + } +} + +void DataSourceModel::setDataSourceManager(DataSourceManager* dataManager) +{ + m_dataManager = dataManager; + connect(m_dataManager,SIGNAL(datasourcesChanged()),this,SLOT(slotDatasourcesChanged())); + updateModel(); +} + +void DataSourceModel::slotDatasourcesChanged() +{ + beginResetModel(); + updateModel(); + endResetModel(); +} + +DataNode* DataSourceModel::nodeFromIndex(const QModelIndex& index) const +{ + if (index.isValid()){ + return static_cast(index.internalPointer()); + } else return m_rootNode; +} + +void DataSourceModel::fillFields(DataNode* parent) +{ + foreach(QString name, m_dataManager->fieldNames(parent->name())){ + parent->addChild(name,DataNode::Field,QIcon(":/report/images/field")); + } +} + +void DataSourceModel::updateModel() +{ + QMap connections; + + m_rootNode->clear(); + DataNode* ds = m_rootNode->addChild(tr("Datasources"),DataNode::DataSources,QIcon(":/report/images/databases")); + + + foreach (QString name,m_dataManager->connectionNames()) { + DataNode* connection = ds->addChild(name,DataNode::Connection,QIcon(":/report/images/database")); + connections.insert(name,connection); + } + + foreach (QString name, m_dataManager->dataSourceNames()) { + DataNode* datasource; + if (m_dataManager->isQuery(name)){ + DataNode* connection = connections.value(m_dataManager->queryByName(name)->connectionName()); + if (connection) datasource=connection->addChild(name,DataNode::Query,QIcon(":/report/images/table")); + else datasource=ds->addChild(name,DataNode::Query); + } else if (m_dataManager->isSubQuery(name)){ + DataNode* connection = connections.value(m_dataManager->subQueryByName(name)->connectionName()); + if (connection) datasource=connection->addChild(name,DataNode::SubQuery,QIcon(":/report/images/table")); + else datasource=ds->addChild(name,DataNode::SubQuery); + } else { + datasource=ds->addChild(name,DataNode::Model,QIcon(":/report/images/table")); + } + fillFields(datasource); + } + + DataNode* vars = m_rootNode->addChild(tr("Variables"),DataNode::Variables,QIcon(":/report/images/folder")); + foreach (QString name, m_dataManager->variableNames()){ + vars->addChild(name,DataNode::Variable,QIcon(":/report/images/value")); + } +} + +DataSourceManager* DataSourceManager::m_instance=0; + +DataSourceManager::DataSourceManager(QObject *parent) : + QObject(parent), m_lastError(""), m_designTime(true) +{ + m_instance=this; + m_groupFunctionFactory.registerFunctionCreator(QLatin1String("COUNT"),new ConstructorGroupFunctionCreator); + m_groupFunctionFactory.registerFunctionCreator(QLatin1String("SUM"),new ConstructorGroupFunctionCreator); + m_groupFunctionFactory.registerFunctionCreator(QLatin1String("AVG"),new ConstructorGroupFunctionCreator); + m_groupFunctionFactory.registerFunctionCreator(QLatin1String("MIN"),new ConstructorGroupFunctionCreator); + m_groupFunctionFactory.registerFunctionCreator(QLatin1String("MAX"),new ConstructorGroupFunctionCreator); + + setSystemVariable(QLatin1String("#PAGE"),1,FirstPass); + setSystemVariable(QLatin1String("#PAGE_COUNT"),0,SecondPass); + + m_datasourcesModel.setDataSourceManager(this); +} +bool DataSourceManager::designTime() const +{ + return m_designTime; +} + +void DataSourceManager::setDesignTime(bool designTime) +{ + m_designTime = designTime; +} + + +DataSourceManager::~DataSourceManager() +{ + clear(All); + clearGroupFunction(); + m_instance=0; +} + +void DataSourceManager::connectAllDatabases() +{ + foreach(ConnectionDesc* conn,m_connections){ + try{ + connectConnection(conn); + } catch (ReportError e){ + putError(e.what()); + setLastError(e.what()); + qDebug()<(ds),true); + putHolder(name,holder); + emit datasourcesChanged(); + return ds; +} + +void DataSourceManager::addCallbackDatasource(ICallbackDatasource *datasource, const QString& name) +{ + IDataSource* datasourceIntf = dynamic_cast(datasource); + if (datasourceIntf){ + IDataSourceHolder* holder = new CallbackDatasourceHolder(datasourceIntf,true); + putHolder(name,holder); + emit datasourcesChanged(); + } +} + +QSharedPointerDataSourceManager::previewSQL(const QString &connectionName, const QString &sqlText) +{ + QSqlDatabase db = QSqlDatabase::database(connectionName); + if (db.isValid() && db.isOpen()){ + QSqlQueryModel* model = new QSqlQueryModel(); + model->setQuery(sqlText,db); + m_lastError = model->lastError().text(); + if (model->query().isActive()) + return QSharedPointer(model); + else + return QSharedPointer(0); + } + if (!db.isOpen()) + m_lastError = tr("Connection \"%1\" is not open").arg(connectionName); + return QSharedPointer(0); +} + +void DataSourceManager::setReportVariable(const QString &name, const QVariant &value) +{ + if (!containsVariable(name)){ + addVariable(name,value); + } else changeVariable(name,value); +} + +void DataSourceManager::addQuery(const QString &name, const QString &sqlText, const QString &connectionName) +{ + QueryDesc *queryDecs = new QueryDesc(name,sqlText,connectionName); + putQueryDesc(queryDecs); + putHolder(name,new QueryHolder(sqlText,connectionName)); + emit datasourcesChanged(); +} + +void DataSourceManager::addSubQuery(const QString &name, const QString &sqlText, const QString &connectionName, const QString &masterDatasource) +{ + SubQueryDesc *subQueryDesc = new SubQueryDesc(name.toLower(),sqlText,connectionName,masterDatasource); + putSubQueryDesc(subQueryDesc); + putHolder(name,new SubQueryHolder(sqlText,connectionName,masterDatasource)); + emit datasourcesChanged(); +} + +void DataSourceManager::addProxy(const QString &name, QString master, QString detail, QList fields) +{ + ProxyDesc *proxyDesc = new ProxyDesc(); + proxyDesc->setName(name); + proxyDesc->setMaster(master); + proxyDesc->setDetail(detail); + foreach(FieldsCorrelation correlation,fields){ + proxyDesc->addFieldsCorrelation(correlation); + } + putProxyDesc(proxyDesc); + putHolder(name,new ProxyHolder(proxyDesc)); + emit datasourcesChanged(); +} + +QString DataSourceManager::queryText(const QString &dataSourceName) +{ + if (isQuery(dataSourceName)) return queryByName(dataSourceName)->queryText(); + if (isSubQuery(dataSourceName)) return subQueryByName(dataSourceName)->queryText(); + else return QString(); +} + +QueryDesc *DataSourceManager::queryByName(const QString &dataSourceName) +{ + int queryIndex = queryIndexByName(dataSourceName); + if (queryIndex!=-1) return m_queries.at(queryIndex); + return 0; +} + +SubQueryDesc* DataSourceManager::subQueryByName(const QString &dataSourceName) +{ + int queryIndex = subQueryIndexByName(dataSourceName); + if (queryIndex!=-1) return m_subqueries.at(queryIndex); + return 0; +} + +ConnectionDesc* DataSourceManager::connectionByName(const QString &connectionName) +{ + int queryIndex = connectionIndexByName(connectionName); + if (queryIndex!=-1) return m_connections.at(queryIndex); + return 0; +} + +int DataSourceManager::queryIndexByName(const QString &dataSourceName) +{ + for(int i=0;iqueryName().compare(dataSourceName,Qt::CaseInsensitive)==0) return i; + } + return -1; +} + +int DataSourceManager::subQueryIndexByName(const QString &dataSourceName) +{ + for(int i=0;iqueryName().compare(dataSourceName,Qt::CaseInsensitive)==0) return i; + } + return -1; +} + +int DataSourceManager::proxyIndexByName(const QString &dataSourceName) +{ + for(int i=0;iname().compare(dataSourceName,Qt::CaseInsensitive)==0) return i; + } + return -1; +} + +int DataSourceManager::connectionIndexByName(const QString &connectionName) +{ + for(int i=0;iname().compare(connectionName,Qt::CaseInsensitive)==0) return i; + } + return -1; +} + +bool DataSourceManager::dataSourceIsValid(const QString &name) +{ + if (m_datasources.value(name.toLower())) return !m_datasources.value(name.toLower())->isInvalid(); + else throw ReportError(tr("Datasource \"%1\" not found !").arg(name)); +} + +bool DataSourceManager::isQuery(const QString &dataSourceName) +{ + return (queryByName(dataSourceName)); +} + +QString DataSourceManager::connectionName(const QString &dataSourceName) +{ + if (isQuery(dataSourceName)) return queryByName(dataSourceName)->connectionName(); + if (isSubQuery(dataSourceName)) return subQueryByName(dataSourceName)->connectionName(); + return QString(); +} + +ProxyDesc *DataSourceManager::proxyByName(QString datasourceName) +{ + int proxyIndex = proxyIndexByName(datasourceName); + if (proxyIndex>-1) return m_proxies.at(proxyIndex); + else return 0; +} + +void DataSourceManager::removeDatasource(const QString &name) +{ + invalidateLinkedDatasources(name); + + if (m_datasources.contains(name)){ + IDataSourceHolder *holder; + holder=m_datasources.value(name); + m_datasources.remove(name); + delete holder; + } + if (isQuery(name)){ + int queryIndex=queryIndexByName(name); + delete m_queries.at(queryIndex); + m_queries.removeAt(queryIndex); + } + if (isSubQuery(name)){ + int queryIndex=subQueryIndexByName(name); + delete m_subqueries.at(queryIndex); + m_subqueries.removeAt(queryIndex); + } + if (isProxy(name)){ + int proxyIndex=proxyIndexByName(name); + delete m_proxies.at(proxyIndex); + m_proxies.removeAt(proxyIndex); + } + emit datasourcesChanged(); +} + +void DataSourceManager::removeConnection(const QString &name) +{ + for(int i=0;iname()==name){ + QSqlDatabase db = QSqlDatabase::database(name); + db.close(); + QSqlDatabase::removeDatabase(name); + delete m_connections.at(i); + m_connections.removeAt(i); + } + } + emit datasourcesChanged(); +} + +void DataSourceManager::addConnectionDesc(ConnectionDesc * connection) +{ + if (!isConnection(connection->name())) { + connect(connection,SIGNAL(nameChanged(QString,QString)),this,SLOT(slotConnectionRenamed(QString,QString))); + m_connections.append(connection); + if (connection->autoconnect()){ + try{ + connectConnection(connection); + } catch(ReportError &exception) { + qDebug()<name())); + } +} + +void DataSourceManager::addQueryDesc(QueryDesc *query) +{ + m_queries.append(query); + addQuery(query->queryName(), query->queryText(), query->connectionName()); +} + +void DataSourceManager::putHolder(QString name, IDataSourceHolder *dataSource) +{ + if (!m_datasources.contains(name.toLower())){ + m_datasources.insert( + name.toLower(), + dataSource + ); + } else throw ReportError(tr("data source with name \"%1\" already exists !!").arg(name)); +} + +void DataSourceManager::putQueryDesc(QueryDesc* queryDesc) +{ + if (!containsDatasource(queryDesc->queryName())){ + m_queries.append(queryDesc); + } else throw ReportError(tr("datasource with name \"%1\"already exists !!").arg(queryDesc->queryName())); +} + +void DataSourceManager::putSubQueryDesc(SubQueryDesc *subQueryDesc) +{ + if (!containsDatasource(subQueryDesc->queryName())){ + m_subqueries.append(subQueryDesc); + } else throw ReportError(tr("datasource with name \"%1\" already exists !!").arg(subQueryDesc->queryName())); +} + +void DataSourceManager::putProxyDesc(ProxyDesc *proxyDesc) +{ + if (!containsDatasource(proxyDesc->name())){ + m_proxies.append(proxyDesc); + } else throw ReportError(tr("datasource with name \"%1\" already exists !!").arg(proxyDesc->name())); +} + +bool DataSourceManager::connectConnection(ConnectionDesc *connectionDesc) +{ + if (QSqlDatabase::contains(connectionDesc->name())) return QSqlDatabase::database(connectionDesc->name()).isOpen(); + + bool connected = false; + QString lastError =""; + { + QSqlDatabase db = QSqlDatabase::addDatabase(connectionDesc->driver(),connectionDesc->name()); + db.setHostName(connectionDesc->host()); + db.setUserName(connectionDesc->userName()); + db.setPassword(connectionDesc->password()); + db.setDatabaseName(connectionDesc->databaseName()); + connected=db.open(); + if (!connected) lastError=db.lastError().text(); + } + if (!connected) { + QSqlDatabase::removeDatabase(connectionDesc->name()); + setLastError(lastError); + return false; + //throw ReportError(lastError); + } else { + foreach(QString datasourceName, dataSourceNames()){ + if (isQuery(datasourceName) || isSubQuery(datasourceName)){ + QueryHolder* qh = dynamic_cast(dataSourceHolder(datasourceName)); + if (qh){ + qh->runQuery(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE); + } + } + } + emit datasourcesChanged(); + } + return true; +} + +bool DataSourceManager::containsDatasource(const QString &dataSourceName) +{ + return m_datasources.contains(dataSourceName.toLower()); +} + +bool DataSourceManager::isSubQuery(const QString &dataSourceName) +{ + return subQueryIndexByName(dataSourceName.toLower())!=-1; +} + +bool DataSourceManager::isProxy(const QString &dataSourceName) +{ + return proxyIndexByName(dataSourceName)!=-1; +} + +bool DataSourceManager::isConnection(const QString &connectionName) +{ + return connectionIndexByName(connectionName)!=-1; +} + +bool DataSourceManager::isConnectionConnected(const QString &connectionName) +{ + if (isConnection(connectionName)){ + return QSqlDatabase::database(connectionName).isOpen(); + } + return false; +} + +bool DataSourceManager::connectConnection(const QString& connectionName) +{ + return connectConnection(connectionByName(connectionName)); +} + +void DataSourceManager::disconnectConnection(const QString& connectionName) +{ + { + QSqlDatabase db = QSqlDatabase::database(connectionName); + if (db.isOpen()) db.close(); + } + if (QSqlDatabase::contains(connectionName)) QSqlDatabase::removeDatabase(connectionName); + foreach(QString datasourceName, dataSourceNames()){ + if (isQuery(datasourceName) || isSubQuery(datasourceName)){ + QueryHolder* qh = dynamic_cast(dataSourceHolder(datasourceName)); + if (qh){ + qh->setLastError(tr("invalid connection")); + } + } + } +} + +IDataSource *DataSourceManager::dataSource(const QString &name) +{ + IDataSourceHolder* holder = m_datasources.value(name.toLower()); + if (holder) { + if (holder->isInvalid()) { + setLastError(holder->lastError()); + return 0; + } else { + return holder->dataSource(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE); + } + } else { + setLastError(tr("Datasource \"%1\" not found !").arg(name)); + return 0; + } +} + +IDataSourceHolder *DataSourceManager::dataSourceHolder(const QString &name) +{ + if (m_datasources.value(name.toLower())) return m_datasources.value(name.toLower()); + else return 0; +} + +QStringList DataSourceManager::dataSourceNames() +{ + QStringList result; + for (int i=0;iconnectionName().compare(connectionName,Qt::CaseInsensitive)==0){ + result.append(query->queryName()); + } + } + foreach (QueryDesc* query, m_subqueries) { + if (query->connectionName().compare(connectionName,Qt::CaseInsensitive)==0){ + result.append(query->queryName()); + } + } + return result; +} + +QStringList DataSourceManager::connectionNames() +{ + QStringList result; + foreach(ConnectionDesc* conDesc,m_connections){ + result.append(conDesc->name()); + } + return result; +} + +QStringList DataSourceManager::fieldNames(const QString &datasourceName) +{ + QStringList result; + IDataSource* ds = dataSource(datasourceName); + if (ds && !ds->isInvalid()){ + for(int i=0;icolumnCount();i++){ + result.append(ds->columnNameByIndex(i)); + } + result.sort(); + } + return result; +} + +void DataSourceManager::addConnection(const QString &connectionName) +{ + addConnectionDesc(new ConnectionDesc(QSqlDatabase::database(connectionName))); + emit datasourcesChanged(); +} + +QObject *DataSourceManager::createElement(const QString& collectionName, const QString&) +{ + if (collectionName=="connections"){ + ConnectionDesc* connection = new ConnectionDesc; + m_connections.append(connection); + return connection; + } + if (collectionName=="queries"){ + QueryDesc* queryDesc = new QueryDesc; + m_queries.append(queryDesc); + return queryDesc; + } + if (collectionName=="subqueries"){ + SubQueryDesc* subQueryDesc = new SubQueryDesc; + m_subqueries.append(subQueryDesc); + return subQueryDesc; + } + if (collectionName=="subproxies"){ + ProxyDesc* proxyDesc = new ProxyDesc; + m_proxies.append(proxyDesc); + return proxyDesc; + } + + if (collectionName=="variables"){ + VarDesc* var = new VarDesc; + m_tempVars.append(var); + return var; + } + + return 0; +} + +int DataSourceManager::elementsCount(const QString &collectionName) +{ + if (collectionName=="connections"){ + return m_connections.count(); + } + if (collectionName=="queries"){ + return m_queries.count(); + } + if (collectionName=="subqueries"){ + return m_subqueries.count(); + } + if (collectionName=="subproxies"){ + return m_proxies.count(); + } + if (collectionName=="variables"){ + return m_varHolder.userVariablesCount(); + } + return 0; +} + +QObject* DataSourceManager::elementAt(const QString &collectionName, int index) +{ + if (collectionName=="connections"){ + return m_connections.at(index); + } + if (collectionName=="queries"){ + return m_queries.at(index); + } + if (collectionName=="subqueries"){ + return m_subqueries.at(index); + } + if (collectionName=="subproxies"){ + return m_proxies.at(index); + } + if (collectionName=="variables"){ + return m_varHolder.userVariableAt(index); + } + return 0; +} + +void DataSourceManager::collectionLoadFinished(const QString &collectionName) +{ + + if (collectionName.compare("connections",Qt::CaseInsensitive)==0){ + foreach(ConnectionDesc* conn,m_connections){ + if (conn->autoconnect()) { + try { + connectConnection(conn); + } catch(ReportError e){ + setLastError(e.what()); + putError(e.what()); + qDebug()<queryName(),new QueryHolder(query->queryText(),query->connectionName())); + } + } + + if (collectionName.compare("subqueries",Qt::CaseInsensitive)==0){ + foreach(SubQueryDesc* query,m_subqueries){ + putHolder(query->queryName(),new SubQueryHolder(query->queryText(),query->connectionName(),query->master())); + } + } + + if(collectionName.compare("subproxies",Qt::CaseInsensitive)==0){ + foreach(ProxyDesc* proxy,m_proxies){ + putHolder(proxy->name(),new ProxyHolder(proxy)); + } + } + + if(collectionName.compare("variables",Qt::CaseInsensitive)==0){ + foreach (VarDesc* item, m_tempVars) { + if (!m_varHolder.containsVariable(item->name())){ + m_varHolder.addVariable(item->name(),item->value(),VarDesc::User,FirstPass); + } + delete item; + } + m_tempVars.clear(); + } + + emit datasourcesChanged(); + emit loadCollectionFinished(collectionName); +} + +void DataSourceManager::addVariable(const QString &name, const QVariant &value, VarDesc::VarType type, RenderPass pass) +{ + m_varHolder.addVariable(name,value,type,pass); + if (designTime()) + emit datasourcesChanged(); +} + +void DataSourceManager::deleteVariable(const QString& name) +{ + if (m_varHolder.containsVariable(name)&&m_varHolder.variableType(name)==VarDesc::User){ + m_varHolder.deleteVariable(name); + if (designTime()) + emit datasourcesChanged(); + } +} + +void DataSourceManager::changeVariable(const QString& name,const QVariant& value) +{ + m_varHolder.changeVariable(name,value); +} + +void DataSourceManager::setSystemVariable(const QString &name, const QVariant &value, RenderPass pass) +{ + addVariable(name,value,VarDesc::System,pass); +} + +void DataSourceManager::setLastError(const QString &value){ + m_lastError = value; + if (!value.isEmpty()) { + m_errorsList.append(value); + } +} + +void DataSourceManager::invalidateLinkedDatasources(QString datasourceName) +{ + foreach(QString name, dataSourceNames()){ + if (isSubQuery(name)){ + if (subQueryByName(name)->master() == datasourceName) + dataSourceHolder(name)->invalidate(); + } + if (isProxy(name)){ + ProxyDesc* proxy = proxyByName(name); + if ((proxy->master() == datasourceName) || (proxy->child() == datasourceName)) + dataSourceHolder(name)->invalidate(); + + } + } +} + +void DataSourceManager::slotConnectionRenamed(const QString &oldName, const QString &newName) +{ + foreach(QueryDesc* query, m_queries){ + if (query->connectionName().compare(oldName,Qt::CaseInsensitive)==0) query->setConnectionName(newName); + } + foreach(SubQueryDesc* query, m_subqueries){ + if (query->connectionName().compare(oldName,Qt::CaseInsensitive)==0) query->setConnectionName(newName); + } +} + +void DataSourceManager::clear(ClearMethod method) +{ + + QList::iterator cit = m_connections.begin(); + while( cit != m_connections.end() ){ + QSqlDatabase::removeDatabase( (*cit)->name() ); + delete (*cit); + cit = m_connections.erase(cit); + } + + DataSourcesMap::iterator dit; + for( dit = m_datasources.begin(); dit != m_datasources.end(); ){ + bool owned = (*dit)->isOwned() && (*dit)->isRemovable(); + switch(method){ + case All: + invalidateLinkedDatasources(dit.key()); + delete dit.value(); + m_datasources.erase(dit++); + break; + default: + if (owned){ + invalidateLinkedDatasources(dit.key()); + delete dit.value(); + m_datasources.erase(dit++); + } else { + ++dit; + } + } + + } + + //TODO: add smart pointes to collections + foreach(QueryDesc *desc, m_queries) delete desc; + foreach(SubQueryDesc* desc, m_subqueries) delete desc; + foreach(ProxyDesc* desc, m_proxies) delete desc; + + m_queries.clear(); + m_subqueries.clear(); + m_proxies.clear(); + + emit cleared(); +} + +void DataSourceManager::clearGroupFunction() +{ + foreach(GroupFunction* gf ,m_groupFunctions.values()){ + delete gf; + } + m_groupFunctions.clear(); +} + +void DataSourceManager::clearGroupFunctionValues(const QString& bandObjectName) +{ + foreach(GroupFunction* gf, m_groupFunctions.values(bandObjectName)){ + gf->values().clear(); + } +} + +GroupFunction* DataSourceManager::addGroupFunction(const QString &name, const QString &expression, const QString &band, const QString& dataBand) +{ + GroupFunction* gf = m_groupFunctionFactory.createGroupFunction(name,expression,dataBand,this); + if (gf){ + m_groupFunctions.insert(band,gf); + } + return gf; +} + +GroupFunction *DataSourceManager::groupFunction(const QString &name, const QString &expression, const QString &band) +{ + foreach(GroupFunction* gf,m_groupFunctions.values(band)){ + if ((gf->name().compare(name,Qt::CaseInsensitive)==0)&& + (gf->data().compare(expression,Qt::CaseInsensitive)==0) + ) return gf; + } + return 0; +} + +QList DataSourceManager::groupFunctionsByBand(const QString &band) +{ + return m_groupFunctions.values(band); +} + +void DataSourceManager::updateChildrenData(const QString &datasourceName) +{ + foreach(SubQueryDesc* subquery,m_subqueries){ + if (subquery->master().compare(datasourceName,Qt::CaseInsensitive)==0){ + SubQueryHolder* holder=dynamic_cast(dataSourceHolder(subquery->queryName())); + if (holder) holder->runQuery(); + } + } + foreach(ProxyDesc* subproxy,m_proxies){ + if(subproxy->master().compare(datasourceName,Qt::CaseInsensitive)==0){ + ProxyHolder* holder = dynamic_cast(dataSourceHolder(subproxy->name())); + holder->filterModel(); + } + } +} + +QString DataSourceManager::extractDataSource(const QString &fieldName) +{ + return fieldName.left(fieldName.indexOf('.')); +} + +QString DataSourceManager::extractFieldName(const QString &fieldName) +{ + return fieldName.right((fieldName.length()-fieldName.indexOf('.'))-1); +} + +bool DataSourceManager::containsField(const QString &fieldName) +{ + IDataSource* ds = dataSource(extractDataSource(fieldName)); + if (ds) { + return ds->columnIndexByName(extractFieldName(fieldName))!=-1; + } + return false; +} + +bool DataSourceManager::containsVariable(const QString& variableName) +{ + return m_varHolder.containsVariable(variableName); +} + +void DataSourceManager::clearUserVariables() +{ + m_varHolder.clearUserVariables(); +} + +QVariant DataSourceManager::fieldData(const QString &fieldName) +{ + if (containsField(fieldName)){ + IDataSource* ds = dataSource(extractDataSource(fieldName)); + if (ds) return ds->data(extractFieldName(fieldName)); + } + return QVariant(); +} + +QVariant DataSourceManager::variable(const QString &variableName) +{ + return m_varHolder.variable(variableName); +} + +RenderPass DataSourceManager::variablePass(const QString &name) +{ + + return (m_varHolder.variablePass(name)==FirstPass)?FirstPass:SecondPass; +} + +bool DataSourceManager::variableIsSystem(const QString &name) +{ + return (m_varHolder.variableType(name)==VarDesc::System); +} + +QStringList DataSourceManager::variableNames() +{ + return m_varHolder.variableNames(); +} + +VarDesc::VarType DataSourceManager::variableType(const QString &name) +{ + return m_varHolder.variableType(name); +} + +void DataSourceManager::setAllDatasourcesToFirst() +{ + foreach(IDataSourceHolder* ds,m_datasources.values()) { + if (ds->dataSource()) ds->dataSource()->first(); + } +} + +} //namespace LimeReport diff --git a/src/lrdatasourcemanager.h b/src/lrdatasourcemanager.h new file mode 100644 index 0000000..5b11b05 --- /dev/null +++ b/src/lrdatasourcemanager.h @@ -0,0 +1,229 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATASOURCEMANAGER_H +#define LRDATASOURCEMANAGER_H + +#include +#include +#include "lrdatasourcemanager.h" +#include "lrdatadesignintf.h" +#include "lrcollection.h" +#include "lrglobal.h" +#include "lrvariablesholder.h" +#include "lrgroupfunctions.h" +#include "lrdatasourcemanagerintf.h" + +namespace LimeReport{ + + +class DataSourceManager; + +class DataNode { +public: + enum NodeType{Root,Connection,DataSources,Query,SubQuery,Model,Field,Variables,Variable}; + DataNode(const QString& name="", NodeType type=Root, DataNode* parent=0, const QIcon& icon=QIcon()) + :m_name(name), m_icon(icon), m_type(type), m_parent(parent){} + virtual ~DataNode(); + int childCount(){return m_childs.count();} + DataNode* child(int index){return m_childs[index];} + DataNode* parent(){return m_parent;} + DataNode* addChild(const QString& name="", NodeType type=Root, const QIcon& icon=QIcon()); + int row(); + QString name(){return m_name;} + QIcon icon(){return m_icon;} + void clear(); + NodeType type(){return m_type;} +private: + QString m_name; + QIcon m_icon; + NodeType m_type; + DataNode* m_parent; + QVector m_childs; +}; + +class DataSourceModel : public QAbstractItemModel{ + Q_OBJECT +public: + DataSourceModel():m_rootNode(new DataNode()){} + DataSourceModel(DataSourceManager* dataManager); + QModelIndex index(int row, int column, const QModelIndex &parent) const; + ~DataSourceModel(); + QModelIndex parent(const QModelIndex &child) const; + int rowCount(const QModelIndex &parent) const; + int columnCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + void setDataSourceManager(DataSourceManager* dataManager); +private slots: + void slotDatasourcesChanged(); +private: + DataNode* nodeFromIndex(const QModelIndex &index) const; + void fillFields(DataNode* parent); + void updateModel(); +private: + DataSourceManager* m_dataManager; + DataNode* m_rootNode; +}; + +class DataSourceManager : public QObject, public ICollectionContainer, public IVariablesContainer, public IDataSourceManager +{ + Q_OBJECT + Q_PROPERTY(ACollectionProperty connections READ fakeCollectionReader) + Q_PROPERTY(ACollectionProperty queries READ fakeCollectionReader) + Q_PROPERTY(ACollectionProperty subqueries READ fakeCollectionReader) + Q_PROPERTY(ACollectionProperty subproxies READ fakeCollectionReader) + Q_PROPERTY(ACollectionProperty variables READ fakeCollectionReader) + friend class ReportEnginePrivate; + friend class ReportRender; +public: + static DataSourceManager* instance(){return m_instance;} +public: + typedef QHash DataSourcesMap; + enum ClearMethod {All,Owned}; + ~DataSourceManager(); + void connectAllDatabases(); + void addConnection(const QString& connectionName); + void addConnectionDesc(ConnectionDesc *); + void addQuery(const QString& name, const QString& sqlText, const QString& connectionName=""); + void addSubQuery(const QString& name, const QString& sqlText, const QString& connectionName, const QString& masterDatasource); + void addProxy(const QString& name, QString master, QString detail, QList fields); + void addModel(const QString& name, QAbstractItemModel *model, bool owned); + ICallbackDatasource* createCallbackDatasouce(const QString &name); + void addCallbackDatasource(ICallbackDatasource *datasource, const QString &name); + void setReportVariable(const QString& name, const QVariant& value); + void deleteVariable(const QString& name); + bool containsVariable(const QString& variableName); + void clearUserVariables(); + QVariant variable(const QString& variableName); + RenderPass variablePass(const QString& name); + QStringList variableNames(); + VarDesc::VarType variableType(const QString& name); + + bool variableIsSystem(const QString& name); + QString queryText(const QString& dataSourceName); + QString connectionName(const QString& dataSourceName); + void removeDatasource(const QString& name); + void removeConnection(const QString& name); + bool isQuery(const QString& dataSourceName); + bool containsDatasource(const QString& dataSourceName); + bool isSubQuery(const QString& dataSourceName); + bool isProxy(const QString& dataSourceName); + bool isConnection(const QString& connectionName); + bool isConnectionConnected(const QString& connectionName); + bool connectConnection(const QString &connectionName); + void disconnectConnection(const QString &connectionName); + QueryDesc* queryByName(const QString& dataSourceName); + SubQueryDesc* subQueryByName(const QString& dataSourceName); + ProxyDesc* proxyByName(QString datasourceName); + ConnectionDesc *connectionByName(const QString& connectionName); + int queryIndexByName(const QString& dataSourceName); + int subQueryIndexByName(const QString& dataSourceName); + int proxyIndexByName(const QString& dataSourceName); + int connectionIndexByName(const QString& connectionName); + + bool dataSourceIsValid(const QString& name); + IDataSource* dataSource(const QString& name); + IDataSourceHolder* dataSourceHolder(const QString& name); + QStringList dataSourceNames(); + QStringList dataSourceNames(const QString& connectionName); + QStringList connectionNames(); + QStringList fieldNames(const QString& datasourceName); + bool containsField(const QString& fieldName); + QVariant fieldData(const QString& fieldName); + + QString extractDataSource(const QString& fieldName); + QString extractFieldName(const QString& fieldName); + void setAllDatasourcesToFirst(); + void clear(ClearMethod method); + void clearGroupFunction(); + void clearGroupFunctionValues(const QString &bandObjectName); + + QList groupFunctionNames(){return m_groupFunctionFactory.functionNames();} + GroupFunction* addGroupFunction(const QString& name, const QString& expression, const QString& band, const QString &dataBand); + GroupFunction* groupFunction(const QString& name, const QString &expression, const QString& band); + QList groupFunctionsByBand(const QString& band); + void updateChildrenData(const QString& datasourceName); + + DataSourceModel* datasourcesModel(){return &m_datasourcesModel;} + QString lastError() const { return m_lastError;} + + void putError(QString error){ if (!m_errorsList.contains(error)) m_errorsList.append(error);} + void clearErrorsList(){ m_errorsList.clear();} + QStringList errorsList(){ return m_errorsList;} + bool designTime() const; + void setDesignTime(bool designTime); + QSharedPointer previewSQL(const QString& connectionName, const QString& sqlText); + +signals: + void loadCollectionFinished(const QString& collectionName); + void cleared(); + void datasourcesChanged(); +protected: + void addQueryDesc(QueryDesc *); + void putHolder(QString name, LimeReport::IDataSourceHolder* dataSource); + void putQueryDesc(QueryDesc *queryDesc); + void putSubQueryDesc(SubQueryDesc *subQueryDesc); + void putProxyDesc(ProxyDesc *proxyDesc); + bool connectConnection(ConnectionDesc* connectionDesc); + //ICollectionContainer + virtual QObject* createElement(const QString& collectionName,const QString&); + virtual int elementsCount(const QString& collectionName); + virtual QObject *elementAt(const QString& collectionName,int index); + virtual void collectionLoadFinished(const QString& collectionName); + + void addVariable(const QString& name, const QVariant& value, VarDesc::VarType type=VarDesc::User, RenderPass pass=FirstPass); + void changeVariable(const QString& name,const QVariant& value); + void setSystemVariable(const QString& name, const QVariant& value, RenderPass pass); + void setLastError(const QString& value); + void invalidateLinkedDatasources(QString datasourceName); +private slots: + void slotConnectionRenamed(const QString& oldName,const QString& newName); +private: + explicit DataSourceManager(QObject *parent = 0); + Q_DISABLE_COPY(DataSourceManager) +private: + static DataSourceManager* m_instance; + QList m_connections; + QList m_queries; + QList m_subqueries; + QList m_proxies; + QList m_tempVars; + + QMultiMap m_groupFunctions; + GroupFunctionFactory m_groupFunctionFactory; + AVariablesHolder m_varHolder; + DataSourcesMap m_datasources; + DataSourceModel m_datasourcesModel; + QString m_lastError; + QStringList m_errorsList; + bool m_designTime; +}; + +} +#endif // LRDATASOURCEMANAGER_H diff --git a/src/lrdatasourcemanagerintf.h b/src/lrdatasourcemanagerintf.h new file mode 100644 index 0000000..123f049 --- /dev/null +++ b/src/lrdatasourcemanagerintf.h @@ -0,0 +1,54 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATASOURCEMANAGERINTF_H +#define LRDATASOURCEMANAGERINTF_H + +#include "lrcallbackdatasourceintf.h" + +class QVariant; +class QString; +class QAbstractItemModel; +namespace LimeReport{ + +class IDataSourceManager{ +public: + virtual void setReportVariable(const QString& name, const QVariant& value)=0; + virtual void deleteVariable(const QString& name)=0; + virtual bool containsVariable(const QString& variableName)=0; + virtual QVariant variable(const QString& variableName)=0; + virtual void addModel(const QString& name, QAbstractItemModel *model, bool owned)=0; + virtual bool containsDatasource(const QString& dataSourceName)=0; + virtual void clearUserVariables()=0; + virtual ICallbackDatasource* createCallbackDatasouce(const QString& name) = 0; + virtual void addCallbackDatasource(ICallbackDatasource* datasource, const QString& name) = 0; +}; + +} +#endif // LRDATASOURCEMANAGERINTF_H diff --git a/src/lrdesignelementsfactory.h b/src/lrdesignelementsfactory.h new file mode 100644 index 0000000..3afc554 --- /dev/null +++ b/src/lrdesignelementsfactory.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDESIGNELEMENTSFACTORY_H +#define LRDESIGNELEMENTSFACTORY_H + +#include "lrbanddesignintf.h" +#include "lrpageheader.h" +#include "lrattribsabstractfactory.h" +#include "lrsimpleabstractfactory.h" +#include "lrsingleton.h" + +namespace LimeReport{ + +typedef BaseDesignIntf* (*CreateBand)(QObject* owner, BaseDesignIntf* parent); + +struct ItemAttribs{ + QString m_alias; + QString m_tag; + ItemAttribs(){} + ItemAttribs(const QString& alias, const QString& tag):m_alias(alias),m_tag(tag){} + bool operator==( const ItemAttribs &right) const { + return (m_alias==right.m_alias) && (m_tag==right.m_tag); + } +}; + +class DesignElementsFactory : public AttribsAbstractFactory +{ +private: + friend class Singleton; +private: + DesignElementsFactory(){} + ~DesignElementsFactory(){} + DesignElementsFactory(const DesignElementsFactory&){} + DesignElementsFactory& operator = (const DesignElementsFactory&){return *this;} +}; + +} +#endif // LRDESIGNELEMENTSFACTORY_H diff --git a/src/lrglobal.cpp b/src/lrglobal.cpp new file mode 100644 index 0000000..34bd880 --- /dev/null +++ b/src/lrglobal.cpp @@ -0,0 +1,40 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include "lrglobal.h" + +QString LimeReport::extractClassName(QString className) +{ + int startPos=className.lastIndexOf("::"); + if(startPos==-1) startPos=0; + else startPos+=2; + return className.right(className.length()-startPos); +} diff --git a/src/lrglobal.h b/src/lrglobal.h new file mode 100644 index 0000000..a701619 --- /dev/null +++ b/src/lrglobal.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef GLOBAL_H +#define GLOBAL_H +#include "qglobal.h" +#include +#include + +#if defined(LIMEREPORT_EXPORTS) +# define LIMEREPORT_EXPORT Q_DECL_EXPORT +#elif defined (LIMEREPORT_IMPORTS) +# define LIMEREPORT_EXPORT Q_DECL_IMPORT +#else +# define LIMEREPORT_EXPORT /**/ +#endif + +namespace LimeReport { + const qreal fontFACTOR = 3.5; + const int mmFACTOR = 10; + const int itemPaleteIconSize = 24; + const qreal minSpaceBorder = 10; + QString extractClassName(QString className); + const QString bandTAG = "band"; + const qreal BAND_MARKER_OPACITY = 1; + const qreal LAYOUT_MARKER_OPACITY = 0.3; + const qreal BAND_NAME_AREA_OPACITY = 0.3; + const qreal BAND_NAME_TEXT_OPACITY = 0.6; + const qreal SELECTION_OPACITY = 0.3; + enum RenderPass {FirstPass, SecondPass}; + enum ArrangeType {AsNeeded, Force}; + const QString FIELD_RX = "\\$D\\s*\\{\\s*([^\\s{}]*)\\s*\\}"; + const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^\\s{}]*)\\s*\\}"; + const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; + const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)"; + const int DATASOURCE_INDEX = 6; + const int VALUE_INDEX = 2; + const QString GROUP_FUNCTION_RX = "(%1\\s*"+GROUP_FUNCTION_PARAM_RX+")"; + const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; + const int SCENE_MARGIN = 50; + class ReportError : public std::runtime_error{ + public: + ReportError(const QString& message):std::runtime_error(message.toStdString()){} + }; + +} // namespace LimeReport + + + +#endif // GLOBAL_H diff --git a/src/lrgroupfunctions.cpp b/src/lrgroupfunctions.cpp new file mode 100644 index 0000000..1f2ab18 --- /dev/null +++ b/src/lrgroupfunctions.cpp @@ -0,0 +1,173 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrgroupfunctions.h" +#include "lrdatasourcemanager.h" +#include "lrbanddesignintf.h" +#include "lritemdesignintf.h" + +#include + +namespace LimeReport { + +void GroupFunction::slotBandRendered(BandDesignIntf *band) +{ + switch (m_dataType){ + case Field: + if (m_dataManager->containsField(m_data)){ + m_values.push_back(m_dataManager->fieldData(m_data)); + } else { + setInvalid(tr("Field \"%1\" not found").arg(m_data)); + } + break; + case Variable: + if (m_dataManager->containsVariable(m_data)){ + m_values.push_back(m_dataManager->variable(m_data)); + } else { + setInvalid(tr("Variable \"%1\" not found").arg(m_data)); + } + break; + case ContentItem:{ + ContentItemDesignIntf* item = dynamic_cast(band->childByName(m_data)); + if (item) + m_values.push_back(item->content()); + else setInvalid(tr("Item \"%1\" not found").arg(m_data)); + break; + } + default: + break; + } +} + +QVariant GroupFunction::addition(QVariant value1, QVariant value2) +{ + return value1.toDouble()+value2.toDouble(); +} + +QVariant GroupFunction::subtraction(QVariant value1, QVariant value2) +{ + return value1.toDouble()-value2.toDouble(); +} + +QVariant GroupFunction::division(QVariant value1, QVariant value2) +{ + return value1.toDouble() / value2.toDouble(); +} + +QVariant GroupFunction::multiplication(QVariant value1, QVariant value2) +{ + return value1.toDouble() * value2.toDouble(); +} + +GroupFunction::GroupFunction(const QString &expression, const QString &dataBandName, DataSourceManager* dataManager) + :m_dataBandName(dataBandName), m_dataManager(dataManager),m_isValid(true), m_errorMessage("") +{ + QRegExp rxField(FIELD_RX,Qt::CaseInsensitive); + if (rxField.indexIn(expression)>=0){ + m_dataType=Field; + m_data = rxField.cap(1); + return; + } + + QRegExp rxVariable(VARIABLE_RX,Qt::CaseInsensitive); + if (rxVariable.indexIn(expression)>=0){ + m_dataType=Variable; + m_data = rxVariable.cap(1); + return; + } + + m_dataType = ContentItem; + m_data = expression; + m_data = m_data.remove('"'); + +} + +GroupFunction *GroupFunctionFactory::createGroupFunction(const QString &functionName, const QString &expression, const QString& dataBandName, DataSourceManager *dataManager) +{ + if (m_creators.contains(functionName)){ + return m_creators.value(functionName)->createFunction(expression, dataBandName, dataManager); + } + return 0; +} + +GroupFunctionFactory::~GroupFunctionFactory() +{ + foreach(GroupFunctionCreator* creator, m_creators.values()){ + delete creator; + } + m_creators.clear(); +} + +QVariant SumGroupFunction::calculate() +{ + QVariant res=0; + foreach(QVariant value,values()){ + res=addition(res,value); + } + return res; +} + +QVariant AvgGroupFunction::calculate() +{ + QVariant res=QVariant(); + foreach(QVariant value,values()){ + res=addition(res,value); + } + if (!res.isNull()&&(values().count()>0)){ + res=division(res,values().count()); + } + return res; +} + +QVariant MinGroupFunction::calculate() +{ + //TODO: check variant type + QVariant res = QVariant(); + if (!values().empty()) res = values().at(0); + foreach(QVariant value, values()){ + if (res.toDouble()>value.toDouble()) res = value; + } + + return res; +} + +QVariant MaxGroupFunction::calculate() +{ + //TODO: check variant type + QVariant res = QVariant(); + if (!values().empty()) res = values().at(0); + foreach(QVariant value, values()){ + if (res.toDouble(). * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRGROUPFUNCTIONS_H +#define LRGROUPFUNCTIONS_H + +#include +#include +#include + +namespace LimeReport{ + +class DataSourceManager; +class BandDesignIntf; + +class GroupFunction : public QObject{ + Q_OBJECT +public: + enum DataType{Variable,Field,Srcipt,ContentItem}; + GroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager); + bool isValid(){return m_isValid;} + void setInvalid(QString message){m_isValid=false,m_errorMessage=message;} + const QString& name(){return m_name;} + const QString& data(){return m_data;} + const QString& error(){return m_errorMessage;} + QVector& values(){return m_values;} + const QString& dataBandName(){return m_dataBandName;} + virtual QVariant calculate()=0; +public slots: + void slotBandRendered(BandDesignIntf* band); +protected: + void setName(const QString& value){m_name=value;} + QVariant addition(QVariant value1, QVariant value2); + QVariant subtraction(QVariant value1, QVariant value2); + QVariant division(QVariant value1, QVariant value2); + QVariant multiplication(QVariant value1, QVariant value2); +private: + QString m_data; + QString m_name; + DataType m_dataType; + QString m_dataBandName; + QVector m_values; + DataSourceManager* m_dataManager; + bool m_isValid; + QString m_errorMessage; +}; + +class GroupFunctionCreator{ +public: + virtual GroupFunction* createFunction(const QString&, const QString&, DataSourceManager*)=0; + virtual ~GroupFunctionCreator(){} +}; + +class GroupFunctionFactory{ +public: + void registerFunctionCreator(const QString& functionName,GroupFunctionCreator* creator){ + m_creators.insert(functionName,creator); + } + QList functionNames(){return m_creators.keys();} + GroupFunction* createGroupFunction(const QString& functionName, const QString& expression, const QString& dataBandName, DataSourceManager* dataManager); + ~GroupFunctionFactory(); +private: + QMap m_creators; +}; + +class CountGroupFunction :public GroupFunction{ + Q_OBJECT +public: + CountGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) + :GroupFunction(expression, dataBandName, dataManager){setName("COUNT");} +protected: + virtual QVariant calculate(){return values().count();} +}; + +class SumGroupFunction :public GroupFunction{ + Q_OBJECT +public: + SumGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) + :GroupFunction(expression, dataBandName, dataManager){setName("SUM");} +protected: + virtual QVariant calculate(); +}; + +class AvgGroupFunction :public GroupFunction{ + Q_OBJECT +public: + AvgGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) + :GroupFunction(expression, dataBandName, dataManager){setName("AVG");} +protected: + virtual QVariant calculate(); +}; + +class MinGroupFunction :public GroupFunction{ + Q_OBJECT +public: + MinGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) + :GroupFunction(expression, dataBandName, dataManager){setName("MIN");} +protected: + virtual QVariant calculate(); +}; + +class MaxGroupFunction :public GroupFunction{ + Q_OBJECT +public: + MaxGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) + :GroupFunction(expression, dataBandName, dataManager){setName("MAX");} +protected: + virtual QVariant calculate(); +}; + +template +class ConstructorGroupFunctionCreator : public GroupFunctionCreator{ + virtual GroupFunction* createFunction(const QString& expression, const QString &dataBandName, DataSourceManager* dataManager); +}; + +template< typename T > +GroupFunction* ConstructorGroupFunctionCreator< T >::createFunction(const QString &expression, const QString &dataBandName, DataSourceManager *dataManager) +{ + return new T(expression, dataBandName, dataManager); +} + +} //namespace LimeReport + +#endif // LRGROUPFUNCTIONS_H diff --git a/src/lritemdesignintf.cpp b/src/lritemdesignintf.cpp new file mode 100644 index 0000000..0ce0542 --- /dev/null +++ b/src/lritemdesignintf.cpp @@ -0,0 +1,239 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lritemdesignintf.h" +#include "lrbasedesignintf.h" +#include "lrpagedesignintf.h" +#include "lrdatasourcemanager.h" +#include "lrscriptenginemanager.h" +#include "lrglobal.h" + +#include +#include +#include + +namespace LimeReport{ + +ItemDesignIntf::ItemDesignIntf(const QString &xmlTypeName, QObject* owner, QGraphicsItem* parent) : + BaseDesignIntf(xmlTypeName,owner,parent), m_itemLocation(Band), m_stretchToMaxHeight(false){ + initFlags(); +} + +void ItemDesignIntf::setItemLocation(LocationType location) +{ + + if (m_itemLocation!=location){ + LocationType oldValue = m_itemLocation; + m_itemLocation=location; + if(!isLoading()){ + if (location==Band){ + QGraphicsItem *parentBand=bandByPos(); + if (parentBand){ + QPointF parentPos = parentBand->mapFromItem(parentItem(),x(),y()); + setParentItem(parentBand); + setParent(dynamic_cast(parentBand)); + setPos(parentPos); + } else { + m_itemLocation=Page; + } + } else { + if (scene()){ + PageItemDesignIntf* page = dynamic_cast(scene())->pageItem(); + QPointF parentPos = page->mapFromItem(parentItem(),x(),y()); + setParentItem(page); + setParent(page); + setPos(parentPos); + } + } + notify("locationType",oldValue,location); + } + } +} + +void ItemDesignIntf::setStretchToMaxHeight(bool value) +{ + if (m_stretchToMaxHeight!=value){ + bool oldValue = m_stretchToMaxHeight; + m_stretchToMaxHeight=value; + notify("stretchToMaxHeight",oldValue,value); + } +} + +BaseDesignIntf *ItemDesignIntf::cloneEmpty(int height, QObject *owner, QGraphicsItem *parent) +{ + BaseDesignIntf* spacer = new Spacer(owner,parent); + spacer->initFromItem(this); + spacer->setHeight(height); + return spacer; +} + +QGraphicsItem * ItemDesignIntf::bandByPos() +{ + foreach(QGraphicsItem *item,collidingItems()){ + if (dynamic_cast(item)){ + return item; + } + } + return 0; +} + +void ItemDesignIntf::initFlags() +{ + BaseDesignIntf::initFlags(); + if ((itemMode()&DesignMode) || (itemMode()&EditMode)){ + setFlag(QGraphicsItem::ItemIsMovable); + } else { + setFlag(QGraphicsItem::ItemIsMovable,false); + } +} + +QString ContentItemDesignIntf::expandDataFields(QString context, ExpandType expandType) +{ + DataSourceManager* dm = DataSourceManager::instance(); + QRegExp rx(FIELD_RX); + + if (context.contains(rx)){ + while ((rx.indexIn(context))!=-1){ + QString field=rx.cap(1); + + if (dm->containsField(field)) { + QString fieldValue; + if (expandType == EscapeSymbols) { + if (dm->fieldData(field).isNull()) { + fieldValue="\"\""; + } else { + fieldValue = escapeSimbols(dm->fieldData(field).toString()); + switch (dm->fieldData(field).type()) { + case QVariant::Char: + case QVariant::String: + case QVariant::StringList: + case QVariant::Date: + case QVariant::DateTime: + fieldValue = "\""+fieldValue+"\""; + break; + default: + break; + } + } + } else { + fieldValue = dm->fieldData(field).toString(); + } + + context.replace(rx.cap(0),fieldValue); + + } else { + QString error; + if (dm->lastError().isEmpty()){ + error = QString("Field %1 not found in %2 !!! ").arg(field).arg(this->objectName()); + dm->putError(error); + } else { + error = dm->lastError(); + } + context.replace(rx.cap(0),error); + } + } + } + + return context; +} + +QString ContentItemDesignIntf::expandUserVariables(QString context, RenderPass pass, ExpandType expandType) +{ + DataSourceManager* dm=DataSourceManager::instance(); + //QRegExp rx("\\$V\\{([^{}]*)\\}"); + QRegExp rx(VARIABLE_RX); + if (context.contains(rx)){ + int pos = 0; + while ((pos = rx.indexIn(context,pos))!=-1){ + QString variable=rx.cap(1); + pos += rx.matchedLength(); + if (dm->containsVariable(variable) ){ + if (pass==dm->variablePass(variable)){ + if (expandType==EscapeSymbols){ + context.replace(rx.cap(0),escapeSimbols(dm->variable(variable).toString())); + } else { + context.replace(rx.cap(0),dm->variable(variable).toString()); + } + pos=0; + } + } else { + context.replace(rx.cap(0),tr("Variable %1 not found").arg(variable)); + } + } + } + return context; +} + +QString ContentItemDesignIntf::expandScripts(QString context) +{ + QRegExp rx(SCRIPT_RX); + + if (context.contains(rx)){ + QScriptEngine* se = ScriptEngineManager::instance().scriptEngine(); + + QScriptValue svThis = se->globalObject().property("THIS"); + if (svThis.isValid()){ + se->newQObject(svThis, this); + } else { + svThis = se->newQObject(this); + se->globalObject().setProperty("THIS",svThis); + } + + ScriptExtractor scriptExtractor(context); + if (scriptExtractor.parse()){ + for(int i=0; ievaluate(scriptBody); + if (!se->hasUncaughtException()) { + context.replace(scriptExtractor.scriptAt(i),value.toString()); + } else { + context.replace(scriptExtractor.scriptAt(i),se->uncaughtException().toString()); + } + } + } + } + return context; +} + +QString ContentItemDesignIntf::content() const +{ + return ""; +} + +QString ContentItemDesignIntf::escapeSimbols(const QString &value) +{ + QString result = value; + return result.replace("\"","\\\""); +} + +Spacer::Spacer(QObject *owner, QGraphicsItem *parent) + :ItemDesignIntf("Spacer",owner,parent){} + +}// namespace LimeReport diff --git a/src/lritemdesignintf.h b/src/lritemdesignintf.h new file mode 100644 index 0000000..ca2b926 --- /dev/null +++ b/src/lritemdesignintf.h @@ -0,0 +1,97 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRITEMDESIGNITTF_H +#define LRITEMDESIGNITTF_H + +#include +#include "lrbasedesignintf.h" + +namespace LimeReport{ +class BaseDesignIntf; +class ItemDesignIntf : public BaseDesignIntf +{ + Q_OBJECT + Q_PROPERTY(LocationType itemLocation READ itemLocation WRITE setItemLocation) + Q_PROPERTY(bool stretchToMaxHeight READ stretchToMaxHeight WRITE setStretchToMaxHeight) + Q_ENUMS(LocationType) +public: + enum LocationType{Band,Page}; + ItemDesignIntf(const QString& xmlTypeName, QObject* owner = 0,QGraphicsItem* parent = 0); + LocationType itemLocation(){return m_itemLocation;} + void setItemLocation(LocationType location); + void setStretchToMaxHeight(bool value); + bool stretchToMaxHeight(){return m_stretchToMaxHeight;} + BaseDesignIntf* cloneEmpty(int height, QObject *owner, QGraphicsItem *parent); +protected: + QGraphicsItem* bandByPos(); + virtual void initFlags(); +private: + LocationType m_itemLocation; + bool m_stretchToMaxHeight; +}; + +class Spacer :public ItemDesignIntf{ +public: + Spacer(QObject* owner,QGraphicsItem* parent); +protected: + BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent){ + return new Spacer(owner, parent); + } +}; + +class ContentItemDesignIntf : public ItemDesignIntf +{ + Q_OBJECT +public: + ContentItemDesignIntf(const QString& xmlTypeName, QObject* owner = 0,QGraphicsItem* parent = 0) + :ItemDesignIntf(xmlTypeName,owner,parent){} + virtual QString content() const; + virtual void setContent(const QString& value)=0; + enum ExpandType {EscapeSymbols, NoEscapeSymbols}; +protected: + QString escapeSimbols(const QString& value); + virtual QString expandUserVariables(QString context, RenderPass pass, ExpandType expandType); + virtual QString expandDataFields(QString context, ExpandType expandType); + virtual QString expandScripts(QString context); + +}; + +class LayoutDesignIntf : public ItemDesignIntf{ +public: + LayoutDesignIntf(const QString& xmlTypeName, QObject* owner = 0,QGraphicsItem* parent = 0): + ItemDesignIntf(xmlTypeName,owner,parent){} + virtual void addChild(BaseDesignIntf *item,bool updateSize=true) = 0; + virtual void restoreChild(BaseDesignIntf *item) = 0; + virtual int childrenCount() = 0; + friend class BaseDesignIntf; +}; + +} +#endif // LRITEMDESIGNITTF_H diff --git a/src/lrpagedesignintf.cpp b/src/lrpagedesignintf.cpp new file mode 100644 index 0000000..5f5dd9d --- /dev/null +++ b/src/lrpagedesignintf.cpp @@ -0,0 +1,1816 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrpagedesignintf.h" +#include "lrbasedesignintf.h" +#include "lrtextitem.h" +#include "lrhorizontallayout.h" +//#include "lrbarcodeitem.h" +#include "lrbanddesignintf.h" +#include "lrbandsmanager.h" +#include "lrreportengine_p.h" + +#include "serializators/lrstorageintf.h" +#include "serializators/lrxmlwriter.h" +#include "serializators/lrxmlreader.h" +#include "lrdesignelementsfactory.h" + +#include "lrpageheader.h" +#include "lrpagefooter.h" + +#include "lrglobal.h" + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace LimeReport +{ + +bool bandSortBandLessThen(const BandDesignIntf *c1, const BandDesignIntf *c2) +{ + return c1->geometry().top() < c2->geometry().top(); +} + +PageDesignIntf::PageDesignIntf(QObject *parent): + QGraphicsScene(parent), + m_pageSize(A4), + m_orientation(Portrait), + m_pageItem(0), + m_insertMode(false), + m_itemInsertRect(0), + m_itemMode(DesignMode), + m_cutterBorder(0), + m_currentCommand(-1), + m_changeSizeMode(false), + m_changePosMode(false), + m_changePosOrSizeMode(false), + m_executingCommand(false), + m_hasHanges(false), + m_isLoading(false), + m_executingGroupCommand(false), + m_settings(0), + m_selectionRect(0) +{ + m_reportEditor = dynamic_cast(parent); + updatePageRect(); + connect(this, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged())); + setBackgroundBrush(QBrush(Qt::white)); +} + +PageDesignIntf::~PageDesignIntf() +{ + if (!m_pageItem.isNull()) { + removeItem(m_pageItem.data()); + m_pageItem.clear(); + } + foreach (PageItemDesignIntf::Ptr pageItem, m_reportPages) { + removeItem(pageItem.data()); + } + m_commandsList.clear(); +} + +void PageDesignIntf::updatePageRect() +{ + if (m_pageItem.isNull()) { + m_pageItem = PageItemDesignIntf::create(this); + addItem(m_pageItem.data()); + m_pageItem->setTopMargin(5); + m_pageItem->setBottomMargin(5); + m_pageItem->setLeftMargin(5); + m_pageItem->setRightMargin(5); + m_pageItem->setObjectName("ReportPage1"); + connect(m_pageItem.data(), SIGNAL(itemSelected(LimeReport::BaseDesignIntf *)), this, SIGNAL(itemSelected(LimeReport::BaseDesignIntf *))); + connect(m_pageItem.data(), SIGNAL(geometryChanged(QObject *, QRectF, QRectF)), this, SLOT(slotPageGeomertyChanged(QObject *, QRectF, QRectF))); + connect(m_pageItem.data(), SIGNAL(objectLoaded(QObject *)), this, SLOT(slotPageItemLoaded(QObject *))); + } + this->setSceneRect(-SCENE_MARGIN, -SCENE_MARGIN, + pageItem()->geometry().width() + SCENE_MARGIN*2, + pageItem()->geometry().height() + SCENE_MARGIN*2); + emit sceneRectChanged(sceneRect()); +} + +PageDesignIntf::Orientation PageDesignIntf::getOrientation() +{ + return m_orientation; +} + +void PageDesignIntf::setPageSize(PageDesignIntf::PageSize sizeType, QSizeF sizeValue) +{ + m_pageSize = sizeType; + m_pageSizeValue = sizeValue; + updatePageRect(); +} + +PageDesignIntf::PageSize PageDesignIntf::pageSize() const +{ + return m_pageSize; +} + +void PageDesignIntf::keyPressEvent(QKeyEvent *event) +{ + if (event->modifiers() == Qt::NoModifier || + (event->key() != Qt::Key_Left && + event->key() != Qt::Key_Right && + event->key() != Qt::Key_Up && + event->key() != Qt::Key_Down && + !m_changePosMode && !m_changeSizeMode ) + ) { + QGraphicsScene::keyPressEvent(event); + return; + } + + if ((event->modifiers()& Qt::ControlModifier) && (!m_changeSizeMode)) { + if (!m_changePosMode) { + saveSelectedItemsPos(); + m_changePosMode = true; + } + } + + if ((event->modifiers()& Qt::ShiftModifier) && (!m_changePosMode)) { + if (!m_changeSizeMode) { + saveSelectedItemsGeometry(); + m_changeSizeMode = true; + } + } + + if ((event->modifiers()& Qt::ControlModifier) && m_changePosMode && (!(event->modifiers()& Qt::ShiftModifier))) { + foreach(QGraphicsItem * item, selectedItems()) { + if (dynamic_cast(item)) { + switch (event->key()) { + case Qt::Key_Right: + dynamic_cast(item)->moveRight(); + break; + case Qt::Key_Left: + dynamic_cast(item)->moveLeft(); + break; + case Qt::Key_Up: + dynamic_cast(item)->moveUp(); + break; + case Qt::Key_Down: + dynamic_cast(item)->moveDown(); + break; + } + } + } + } + + if ((event->modifiers()& Qt::ShiftModifier) && m_changeSizeMode && (!(event->modifiers()& Qt::ControlModifier))) { + foreach(QGraphicsItem * item, selectedItems()) { + if (dynamic_cast(item)) { + switch (event->key()) { + case Qt::Key_Right: + dynamic_cast(item)->sizeRight(); + break; + case Qt::Key_Left: + dynamic_cast(item)->sizeLeft(); + break; + case Qt::Key_Up: + dynamic_cast(item)->sizeUp(); + break; + case Qt::Key_Down: + dynamic_cast(item)->sizeDown(); + break; + } + } + } + } +} + +void PageDesignIntf::keyReleaseEvent(QKeyEvent *event) +{ + if ((event->key() == Qt::Key_Control) && m_changePosMode) { + checkSizeOrPosChanges(); + } + + if ((event->key() == Qt::Key_Shift) && m_changeSizeMode ) { + checkSizeOrPosChanges(); + } + + QGraphicsScene::keyReleaseEvent(event); +} + +void PageDesignIntf::startInsertMode(const QString &ItemType) +{ + if (m_insertMode) emit itemInsertCanceled(m_insertItemType); + + emit insertModeStarted(); + m_insertMode = true; + m_insertItemType = ItemType; + m_itemInsertRect = this->addRect(0, 0, 200, 50); + m_itemInsertRect->setVisible(false); + m_itemInsertRect->setParentItem(pageItem()); +} + +void PageDesignIntf::startEditMode() +{ + if (m_insertMode) emit itemInsertCanceled(m_insertItemType); + + finalizeInsertMode(); + m_insertMode = false; +} + +PageItemDesignIntf *PageDesignIntf::pageItem() +{ + return m_pageItem.data(); +} + +void PageDesignIntf::setPageItem(PageItemDesignIntf::Ptr pageItem) +{ + if (!m_pageItem.isNull()) { + removeItem(m_pageItem.data()); + m_pageItem->setParent(0); + } + m_pageItem = pageItem; + m_pageItem->setItemMode(itemMode()); + setSceneRect(pageItem->rect().adjusted(-10*mmFACTOR,-10*mmFACTOR,10*mmFACTOR,10*mmFACTOR)); + addItem(m_pageItem.data()); + registerItem(m_pageItem.data()); +} + +void PageDesignIntf::setPageItems(QList pages) +{ + if (!m_pageItem.isNull()) { + removeItem(m_pageItem.data()); + m_pageItem.clear(); + } + int curHeight = 0; + int curWidth = 0; + m_reportPages = pages; + foreach (PageItemDesignIntf::Ptr pageItem, pages) { + pageItem->setItemMode(itemMode()); + addItem(pageItem.data()); + registerItem(pageItem.data()); + pageItem->setPos(0,curHeight); + curHeight+=pageItem->height()+20; + if (curWidthwidth()) curWidth=pageItem->width(); + } + setSceneRect(QRectF(0,0,curWidth,curHeight).adjusted(-10*mmFACTOR,-10*mmFACTOR,10*mmFACTOR,10*mmFACTOR)); + +} + +void PageDesignIntf::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (m_insertMode) { + finalizeInsertMode(); + CommandIf::Ptr command = InsertItemCommand::create(this, m_insertItemType, event->scenePos(), QSize(200, 50)); + saveCommand(command); + emit itemInserted(this, event->scenePos(), m_insertItemType); + } + if (event->buttons() & Qt::LeftButton && event->modifiers()==Qt::ShiftModifier){ + m_startSelectionPoint = event->scenePos(); + } else { + QGraphicsScene::mousePressEvent(event); + } +} + +void PageDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + + if (event->buttons() & Qt::LeftButton) { + if (!m_changePosOrSizeMode) { + saveSelectedItemsPos(); + saveSelectedItemsGeometry(); + m_changePosOrSizeMode = true; + } + } + + if (event->buttons() & Qt::LeftButton && event->modifiers()==Qt::ShiftModifier){ + if (!m_selectionRect){ + m_selectionRect = new QGraphicsRectItem(); + QBrush brush(QColor(140,190,30,50)); + m_selectionRect->setBrush(brush); + m_selectionRect->setPen(Qt::DashLine); + addItem(m_selectionRect); + } + m_selectionRect->setRect(m_startSelectionPoint.x(),m_startSelectionPoint.y(), + event->scenePos().x()-m_startSelectionPoint.x(), + event->scenePos().y()-m_startSelectionPoint.y()); + setSelectionRect(m_selectionRect->rect()); + } + + if ((m_insertMode) && (pageItem()->rect().contains(pageItem()->mapFromScene(event->scenePos())))) { + if (!m_itemInsertRect->isVisible()) m_itemInsertRect->setVisible(true); + m_itemInsertRect->setPos(pageItem()->mapFromScene(event->scenePos())); + } + else { if (m_insertMode) m_itemInsertRect->setVisible(false); } + + QGraphicsScene::mouseMoveEvent(event); +} + +void PageDesignIntf::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + if ( (event->button() == Qt::LeftButton)) { + checkSizeOrPosChanges(); + } + if (m_selectionRect) { + delete m_selectionRect; + m_selectionRect = 0; + } + QGraphicsScene::mouseReleaseEvent(event); +} + +void PageDesignIntf::setSelectionRect(QRectF selectionRect){ + clearSelection(); + foreach(QGraphicsItem* item, items()){ + if ( selectionRect.intersects(item->mapRectToScene(item->boundingRect()))) + if (dynamic_cast(item)) + item->setSelected(true); + } +} + +BaseDesignIntf *PageDesignIntf::addBand(const QString &bandType) +{ + return internalAddBand(bandType); +} + +BaseDesignIntf *PageDesignIntf::addBand(BandDesignIntf::BandsType bandType) +{ + return internalAddBand(bandType); +} + +template +BaseDesignIntf *PageDesignIntf::internalAddBand(T bandType) +{ + + QSet needParentBands; + needParentBands << BandDesignIntf::SubDetailBand + << BandDesignIntf::SubDetailHeader + << BandDesignIntf::SubDetailFooter + << BandDesignIntf::GroupHeader + << BandDesignIntf::GroupFooter; + + BandsManager bandsManager; + BandDesignIntf *band = bandsManager.createBand(bandType, pageItem(), pageItem()); + + if (band->isUnique()) { + if (pageItem()->isBandExists(bandType)) { + delete band; + return 0; + } + } + + band->setObjectName(genObjectName(*band)); + band->setItemTypeName("Band"); + + BandDesignIntf* pb = 0; + if (selectedItems().count() > 0) { + pb = dynamic_cast(selectedItems().at(0)); + } + + bool increaseBandIndex = false; + int bandIndex = pageItem()->calcBandIndex(band->bandType(), pb, increaseBandIndex); + band->setBandIndex(bandIndex); + if (needParentBands.contains(band->bandType())){ + band->setParentBand(pb); + } + if (increaseBandIndex) pageItem()->increaseBandIndex(bandIndex); + + registerItem(band); + foreach(QGraphicsItem * item, selectedItems()) item->setSelected(false); + band->setSelected(true); + CommandIf::Ptr command = InsertBandCommand::create(this, band->objectName()); + saveCommand(command, false); + return band; +} + +void PageDesignIntf::bandGeometryChanged(QObject* /*object*/, QRectF newGeometry, QRectF oldGeometry) +{ + Q_UNUSED(newGeometry); + Q_UNUSED(oldGeometry); + pageItem()->relocateBands(); +} + +BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QPointF pos, QSizeF size) +{ + BandDesignIntf *band=0; + foreach(QGraphicsItem * item, items(pos)) { + band = dynamic_cast(item); + if (band) break; + } + + if (band) { + BaseDesignIntf *reportItem = addReportItem(itemType, band, band); + reportItem->setPos(band->mapFromScene(pos)); + reportItem->setSize(size); + return reportItem; + } else { + BaseDesignIntf *reportItem = addReportItem(itemType, pageItem(), pageItem()); + reportItem->setPos(pageItem()->mapFromScene(pos)); + reportItem->setSize(size); + ItemDesignIntf* ii = dynamic_cast(reportItem); + if (ii) + ii->setItemLocation(ItemDesignIntf::Page); + return reportItem; + } + + return 0; +} + +BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QObject *owner, LimeReport::BaseDesignIntf *parent) +{ + BaseDesignIntf *item = LimeReport::DesignElementsFactory::instance().objectCreator(itemType)((owner) ? owner : pageItem(), (parent) ? parent : pageItem()); + item->setObjectName(genObjectName(*item)); + item->setItemTypeName(itemType); + registerItem(item); + return item; +} + +BaseDesignIntf *PageDesignIntf::createReportItem(const QString &itemType, QObject* owner, BaseDesignIntf* parent) +{ + return LimeReport::DesignElementsFactory::instance().objectCreator(itemType)((owner) ? owner : pageItem(), (parent) ? parent : pageItem()); +} + +CommandIf::Ptr createBandDeleteCommand(PageDesignIntf* page, BandDesignIntf* band){ + + if (band->hasChildren()){ + CommandIf::Ptr command = CommandGroup::create(); + command->addCommand(DeleteItemCommand::create(page,band),false); + foreach(BandDesignIntf* curband, band->childBands()){ + command->addCommand(createBandDeleteCommand(page,curband),false); + } + return command; + } else { + CommandIf::Ptr command = DeleteItemCommand::create(page,band); + return command; + } +} + +void PageDesignIntf::removeReportItem(BaseDesignIntf *item, bool createComand) +{ + + if (!createComand){ + removeItem(item); + BandDesignIntf* band = dynamic_cast(item); + if (band){ + emit bandRemoved(this,band); + } else { + emit itemRemoved(this,item); + } + delete item; + } else { + + BandDesignIntf* band = dynamic_cast(item); + if (band){ + CommandIf::Ptr command = createBandDeleteCommand(this,band); + saveCommand(command); + } else { + LayoutDesignIntf* layout = dynamic_cast(item->parent()); + if (layout && (layout->childrenCount()==2)){ + CommandGroup::Ptr commandGroup = CommandGroup::create(); + commandGroup->addCommand(DeleteLayoutCommand::create(this, layout),false); + commandGroup->addCommand(DeleteItemCommand::create(this,item),false); + saveCommand(commandGroup); + } else { + CommandIf::Ptr command = (dynamic_cast(item))? + DeleteLayoutCommand::create(this, dynamic_cast(item)) : + DeleteItemCommand::create(this, item) ; + saveCommand(command); + } + } + } + +} + +bool PageDesignIntf::saveCommand(CommandIf::Ptr command, bool runCommand) +{ + if (m_executingCommand||m_isLoading) return false; + if (runCommand) { + m_executingCommand = true; + if (!command->doIt()) { + m_executingCommand = false; + return false; + } + m_executingCommand = false; + } + + if (m_currentCommand < (m_commandsList.count() - 1)) + m_commandsList.remove(m_currentCommand + 1, m_commandsList.size() - (m_currentCommand + 1)); + + m_commandsList.push_back(command); + m_currentCommand = m_commandsList.count() - 1; + m_hasHanges = true; + emit commandHistoryChanged(); + return true; +} + +bool PageDesignIntf::isCanRedo() +{ + return m_currentCommand < m_commandsList.count() - 1; +} + +bool PageDesignIntf::isCanUndo() +{ + return m_currentCommand >= 0; +} + +bool PageDesignIntf::isHasChanges() +{ + return (m_commandsList.count() > 0) && m_hasHanges; +} + +bool PageDesignIntf::isItemInsertMode() +{ + return m_insertMode; +} + +void PageDesignIntf::bandPosChanged(QObject * /*object*/, QPointF /*newPos*/, QPointF /*oldPos*/) +{ + //relocateBands(dynamic_cast(object)); +} + +QString PageDesignIntf::genObjectName(const QObject &object) +{ + int index = 1; + QString className(object.metaObject()->className()); + className = className.right(className.length() - (className.lastIndexOf("::") + 2)); + + QString tmpName = QString("%1%2").arg(className).arg(index); + + while (isExistsObjectName(tmpName)) { + index++; + tmpName = QString("%1%2").arg(className).arg(index); + } + + return tmpName; +} + +bool PageDesignIntf::isExistsObjectName(const QString &objectName) const +{ + QObject *item = 0; + + for (int i = 0; i < items().count(); i++) { + item = dynamic_cast(items()[i]); + + if (item) + if (item->objectName() == objectName) return true; + } + + return false; +} + +QRectF PageDesignIntf::getRectByPageSize(PageDesignIntf::PageSize pageSize) +{ + if (m_pageSize != Custom) { + QPrinter printer; + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setOrientation((QPrinter::Orientation)getOrientation()); + printer.setPageSize((QPrinter::PageSize)pageSize); + return QRectF(0, 0, printer.paperRect(QPrinter::Millimeter).width() * 10, + printer.paperSize(QPrinter::Millimeter).height() * 10); + } + + else { + return QRectF(0, 0, m_pageSizeValue.width() * 10, + m_pageSizeValue.height() * 10); + } +} + +bool PageDesignIntf::isLoading() +{ + return m_isLoading; +} + +void PageDesignIntf::objectLoadStarted() +{ + m_isLoading=true; +} + +void PageDesignIntf::objectLoadFinished() +{ + m_isLoading=false; +} + +void PageDesignIntf::removeBand(BandDesignIntf *band) +{ + removeItem(band); + pageItem()->removeBand(band); +} + +ReportEnginePrivate *PageDesignIntf::reportEditor() +{ + return m_reportEditor; +} + +void PageDesignIntf::dragEnterEvent(QGraphicsSceneDragDropEvent *event) +{ + + if (!event->mimeData()->text().isEmpty()){ + event->setDropAction(Qt::CopyAction); + event->accept(); + } else { + event->setDropAction(Qt::IgnoreAction); + event->ignore(); + } +} + +void PageDesignIntf::dragMoveEvent(QGraphicsSceneDragDropEvent* /**event*/) +{ +// event->setDropAction(Qt::CopyAction); +// event->accept(); +} + +void PageDesignIntf::dropEvent(QGraphicsSceneDragDropEvent* event) +{ + +// if (m_itemInsertRect) { +// removeItem(m_itemInsertRect); +// delete m_itemInsertRect; +// m_itemInsertRect = 0; +// } + +// if (event->mimeData()->text() == "Text Item") { +// addReportItem(event->mimeData()->text(), event->scenePos(), QSizeF(200, 50)); +// } + +// else addBand(event->mimeData()->text()); + BaseDesignIntf* item = addReportItem("TextItem",event->scenePos(),QSize(250, 50)); + TextItem* ti = dynamic_cast(item); + ti->setContent(event->mimeData()->text()); + +} + +void PageDesignIntf::dragLeaveEvent(QGraphicsSceneDragDropEvent *) +{ + //removeItem(m_itemInsertRect); + //delete m_itemInsertRect; + //m_itemInsertRect = 0; +} + +QStringList PageDesignIntf::posibleParentItems() +{ + QStringList itemsList; + foreach(QGraphicsItem * item, items()) { + BandDesignIntf *band = dynamic_cast(item); + + if (band) { + itemsList.append(band->objectName()); + } + } + return itemsList; +} + +void PageDesignIntf::slotPageGeomertyChanged(QObject *, QRectF /*newGeometry*/, QRectF) +{ + if (!m_isLoading){ + pageItem()->relocateBands(); + updatePageRect(); + emit geometryChanged(sceneRect()); + } +} + +void PageDesignIntf::slotItemPropertyChanged(QString propertyName, const QVariant &oldValue, const QVariant& newValue) +{ + if (!m_isLoading && m_animationList.isEmpty()){ + saveChangeProppertyCommand(sender()->objectName(),propertyName,oldValue,newValue); + emit itemPropertyChanged(sender()->objectName(),propertyName,oldValue,newValue); + } +} + +void PageDesignIntf::slotItemPropertyObjectNameChanged(const QString &oldName, const QString &newName) +{ + if (oldName.compare(newName)!=0 && !m_executingCommand){ + CommandIf::Ptr command = PropertyObjectNameChangedCommand::create(this, oldName, newName); + saveCommand(command, false); + } +} + +void PageDesignIntf::bandDeleted(QObject *band) +{ + pageItem()->removeBand(reinterpret_cast(band)); + delete band; + pageItem()->relocateBands(); +} + +void PageDesignIntf::slotPageItemLoaded(QObject *) +{ + setItemMode(m_itemMode); +} + +void PageDesignIntf::slotSelectionChanged() +{ + if (selectedItems().count() == 1) { + m_firstSelectedItem = dynamic_cast(selectedItems().at(0)); + } +} + +void PageDesignIntf::slotAnimationStoped(QObject *animation) +{ + m_animationList.removeOne(animation); +} + +void PageDesignIntf::finalizeInsertMode() +{ + if (m_insertMode) { + m_insertMode = false; + if (m_itemInsertRect) { + removeItem(m_itemInsertRect); + delete m_itemInsertRect; + m_itemInsertRect = 0; + } + } +} + +void PageDesignIntf::saveSelectedItemsPos() +{ + m_positionStamp.clear(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *reportItem = dynamic_cast(item); + + if (reportItem) { + ReportItemPos rp; + rp.objectName = reportItem->objectName(); + rp.pos = reportItem->pos(); + m_positionStamp.push_back(rp); + } + } +} + +void PageDesignIntf::saveSelectedItemsGeometry() +{ + m_geometryStamp.clear(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *reportItem = dynamic_cast(item); + + if (reportItem) { + ReportItemSize rs; + rs.objectName = reportItem->objectName(); + rs.size = reportItem->size(); + m_geometryStamp.append(rs); + } + } +} + +void PageDesignIntf::checkSizeOrPosChanges() +{ + + if ((selectedItems().count() > 0) && (m_positionStamp.count() > 0)) { + if (m_positionStamp[0].pos != selectedItems().at(0)->pos()) { + createChangePosCommand(); + } + + m_positionStamp.clear(); + } + + if ((selectedItems().count() > 0) && (m_geometryStamp.count() > 0)) { + BaseDesignIntf *reportItem = dynamic_cast(selectedItems()[0]); + + if (reportItem && (m_geometryStamp[0].size != reportItem->size())) { + createChangeSizeCommand(); + } + + m_geometryStamp.clear(); + } + + m_changeSizeMode = false; + m_changePosMode = false; + m_changePosOrSizeMode = false; + +} + +void PageDesignIntf::createChangePosCommand() +{ + QVector newPoses; + foreach(ReportItemPos itemPos, m_positionStamp) { + BaseDesignIntf *reportItem = reportItemByName(itemPos.objectName); + + if (reportItem) { + ReportItemPos newPos; + newPos.objectName = reportItem->objectName(); + newPos.pos = reportItem->pos(); + newPoses.append(newPos); + } + } + CommandIf::Ptr command = PosChangedCommand::create(this, m_positionStamp, newPoses); + saveCommand(command); +} + +void PageDesignIntf::createChangeSizeCommand() +{ + QVector newSizes; + + foreach(ReportItemSize itemPos, m_geometryStamp) { + BaseDesignIntf *reportItem = reportItemByName(itemPos.objectName); + + if (reportItem) { + ReportItemSize newSize; + newSize.objectName = reportItem->objectName(); + newSize.size = reportItem->size(); + newSizes.append(newSize); + } + } + CommandIf::Ptr command = SizeChangedCommand::create(this, m_geometryStamp, newSizes); + saveCommand(command); +} + +void PageDesignIntf::reactivatePageItem(PageItemDesignIntf::Ptr pageItem) +{ + pageItem->setItemMode(itemMode()); + if (pageItem.data()->scene()!=this) + addItem(pageItem.data()); +} + +void PageDesignIntf::animateItem(BaseDesignIntf *item) +{ + if (item && (item->metaObject()->indexOfProperty("backgroundColor")>-1)){ + + foreach (QObject* obj, m_animationList) { + QPropertyAnimation* animation = dynamic_cast(obj); + if (animation->targetObject() == item) return; + } + + QPropertyAnimation* ani1 = new QPropertyAnimation(item,"backgroundColor"); + m_animationList.append(ani1); + + QColor startColor = QColor(Qt::red); + QColor endColor = item->backgroundColor(); + + ani1->setDuration(500); + ani1->setEasingCurve(QEasingCurve::Linear); + ani1->setStartValue(startColor); + ani1->setEndValue(endColor); + ani1->start(QAbstractAnimation::DeleteWhenStopped); + + + connect(ani1,SIGNAL(destroyed(QObject*)), this, SLOT(slotAnimationStoped(QObject*))); + } +} + +void PageDesignIntf::registerItem(BaseDesignIntf *item) +{ + item->setItemMode(itemMode()); + BandDesignIntf *band = dynamic_cast(item); + if (band){ + registerBand(band); + connect(band, SIGNAL(propertyObjectNameChanged(QString,QString)), this, SLOT(slotItemPropertyObjectNameChanged(QString,QString))); + emit bandAdded(this,band); + } else { + connect(item, SIGNAL(propertyChanged(QString,QVariant,QVariant)), this, SLOT(slotItemPropertyChanged(QString,QVariant,QVariant))); + connect(item, SIGNAL(propertyObjectNameChanged(QString,QString)), this, SLOT(slotItemPropertyObjectNameChanged(QString,QString))); + emit itemAdded(this,item); + } +} + +void PageDesignIntf::emitRegisterdItem(BaseDesignIntf *item){ + emit itemAdded(this,item); +} + +void PageDesignIntf::emitItemRemoved(BaseDesignIntf *item) +{ + BandDesignIntf* band = dynamic_cast(item); + if (band){ + emit bandRemoved(this,band); + } else { + emit itemRemoved(this,item); + } +} +void PageDesignIntf::registerBand(BandDesignIntf *band) +{ + if (pageItem()&&!pageItem()->isBandRegistred(band)) { + pageItem()->registerBand(band); + if (itemMode() == DesignMode) pageItem()->relocateBands(); + } +} + +void PageDesignIntf::slotUpdateItemSize() +{ + foreach(QGraphicsItem * item, items()) { + BandDesignIntf *reportBand = dynamic_cast(item); + + if (reportBand) reportBand->updateItemSize(); + } +} + +void PageDesignIntf::saveChangeProppertyCommand(const QString &objectName, const QString &propertyName, const QVariant &oldPropertyValue, const QVariant &newPropertyValue) +{ + if (!m_executingCommand) { + CommandIf::Ptr command = PropertyChangedCommand::create(this, objectName, propertyName, oldPropertyValue, newPropertyValue); + saveCommand(command, false); + } +} + +void PageDesignIntf::changeSelectedGroupProperty(const QString &name, const QVariant &value) +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + m_executingCommand = true; + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QVariant oldValue = bdItem->property(name.toLatin1()); + if (oldValue.isValid()){ + bdItem->setProperty(name.toLatin1(),value); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), name, oldValue, value); + cm->addCommand(command, false); + } + } + } + m_executingCommand = false; + saveCommand(cm, false); + } +} + +void PageDesignIntf::undo() +{ + if (m_currentCommand >= 0) { + m_executingCommand = true; + m_commandsList.at(m_currentCommand)->undoIt(); + m_currentCommand--; + m_hasHanges = true; + m_executingCommand = false; + } +} + +void PageDesignIntf::redo() +{ + if (m_currentCommand < m_commandsList.count() - 1) { + m_executingCommand = true; + m_currentCommand++; + m_commandsList.at(m_currentCommand)->doIt(); + m_hasHanges = true; + m_executingCommand = false; + } +} + +void PageDesignIntf::copy() +{ + if (!selectedItems().isEmpty()) { + QClipboard *clipboard = QApplication::clipboard(); + ItemsWriterIntf *writer = new XMLWriter; + bool shouldWrite = false; + foreach(QGraphicsItem * item, selectedItems()) { + ItemDesignIntf *reportItem = dynamic_cast(item); + + if (reportItem) { + writer->putItem(reportItem); + shouldWrite = true; + } + } + + if (shouldWrite) { + clipboard->setText(writer->saveToString()); + } + } +} + +void PageDesignIntf::paste() +{ + QClipboard *clipboard = QApplication::clipboard(); + + if (selectedItems().count() == 1) { + BandDesignIntf *band = dynamic_cast(selectedItems().at(0)); + if (band) { + CommandIf::Ptr command = PasteCommand::create(this, clipboard->text(), band); + saveCommand(command); + } else { + PageItemDesignIntf* page = dynamic_cast(selectedItems().at(0)); + if (page){ + CommandIf::Ptr command = PasteCommand::create(this, clipboard->text(), page); + saveCommand(command); + } + } + } +} + +void PageDesignIntf::deleteSelected() +{ + foreach(QGraphicsItem* item, selectedItems()){ + removeReportItem(dynamic_cast(item),false); + } +} + +void PageDesignIntf::cut() +{ + CommandIf::Ptr command = CutCommand::create(this); + saveCommand(command); +} + +void PageDesignIntf::setToSaved() +{ + m_hasHanges = false; +} + +void PageDesignIntf::bringToFront() +{ + foreach(QGraphicsItem * item, selectedItems()) { + qreal zOrder = 0; + foreach(QGraphicsItem * colItem, collidingItems(item)) { + if (zOrder <= colItem->zValue()) + zOrder = colItem->zValue() + 0.1; + } + BaseDesignIntf *bdItem = dynamic_cast(item); + + if (bdItem) + saveChangeProppertyCommand(bdItem->objectName(), "zOrder", bdItem->zValue(), zOrder); + + item->setZValue(zOrder); + } +} + +void PageDesignIntf::sendToBack() +{ + foreach(QGraphicsItem * item, selectedItems()) { + qreal zOrder = 0; + foreach(QGraphicsItem * colItem, collidingItems(item)) { + if (zOrder >= colItem->zValue()) + zOrder = colItem->zValue() - 0.1; + } + BaseDesignIntf *bdItem = dynamic_cast(item); + + if (bdItem) + saveChangeProppertyCommand(bdItem->objectName(), "zOrder", bdItem->zValue(), zOrder); + + item->setZValue(zOrder); + } +} + +void PageDesignIntf::alignToLeft() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setPos(QPoint(m_firstSelectedItem->pos().x(), item->pos().y())); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::alignToRigth() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setPos(QPoint(m_firstSelectedItem->geometry().right() - bdItem->width(), bdItem->pos().y())); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::alignToVCenter() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setPos(QPoint((m_firstSelectedItem->geometry().right() - m_firstSelectedItem->width() / 2) - bdItem->width() / 2, bdItem->pos().y())); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::alignToTop() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setPos(QPoint(bdItem->pos().x(), m_firstSelectedItem->pos().y())); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::alignToBottom() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setPos(QPoint(bdItem->pos().x(), m_firstSelectedItem->geometry().bottom() - bdItem->height())); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::alignToHCenter() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setPos(QPoint(bdItem->pos().x(), (m_firstSelectedItem->geometry().bottom() - m_firstSelectedItem->height() / 2) - bdItem->height() / 2)); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::sameWidth() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setWidth(m_firstSelectedItem->width()); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::sameHeight() +{ + if ((selectedItems().count() > 0) && m_firstSelectedItem) { + CommandGroup::Ptr cm = CommandGroup::create(); + foreach(QGraphicsItem * item, selectedItems()) { + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + QRectF oldGeometry = bdItem->geometry(); + bdItem->setHeight(m_firstSelectedItem->height()); + CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); + cm->addCommand(command, false); + } + } + saveCommand(cm, false); + } +} + +void PageDesignIntf::addHLayout() +{ + + if (selectedItems().size()==0) return; + + QList si = selectedItems(); + QList::iterator it = si.begin(); + for (; it != si.end();) { + if (!dynamic_cast(*it)) { + (*it)->setSelected(false); + it = si.erase(it); + } + else ++it; + } + + it = si.begin(); + QGraphicsItem* elementsParent = (*it)->parentItem(); + for (; it != si.end();++it) { + if ((*it)->parentItem()!=elementsParent){ + QMessageBox::information(0,QObject::tr("Attention!"),QObject::tr("Selected elements have different parent containers")); + return; + } + } + + CommandIf::Ptr cm = InsertHLayoutCommand::create(this); + saveCommand(cm,true); +} + +bool hLayoutLessThen(QGraphicsItem *c1, QGraphicsItem *c2) +{ + return c1->pos().x() < c2->pos().x(); +} + +HorizontalLayout* PageDesignIntf::internalAddHLayout() +{ + if (m_firstSelectedItem && (selectedItems().count() > 1)) { + + QList si = selectedItems(); + QList::iterator it = si.begin(); + qSort(si.begin(), si.end(), hLayoutLessThen); + it = si.begin(); + + if (si.count() > 1) { + + it = si.begin(); + BaseDesignIntf *firstElement = dynamic_cast(*it); + + HorizontalLayout *layout = new HorizontalLayout(firstElement->parent(), firstElement->parentItem()); + layout->setPos(firstElement->pos()); + layout->setWidth(0); + layout->setHeight(firstElement->height()); + + for (; it != si.end(); ++it) { + BaseDesignIntf *bdItem = dynamic_cast(*it); + layout->addChild(bdItem); + } + + foreach(QGraphicsItem * item, selectedItems()) { + item->setSelected(false); + } + + layout->setSelected(true); + layout->setObjectName(genObjectName(*layout)); + layout->setItemTypeName("HorizontalLayout"); + registerItem(layout); + return layout; + } + } + return 0; +} + +void PageDesignIntf::setFont(const QFont& font) +{ + changeSelectedGroupProperty("font",font); +} + +void PageDesignIntf::setTextAlign(const Qt::Alignment& alignment) +{ + changeSelectedGroupProperty("alignment",QVariant(alignment)); +} + +void PageDesignIntf::setBorders(const BaseDesignIntf::BorderLines& border) +{ + changeSelectedGroupProperty("borders", (int)border); +} + +void PageDesignIntf::removeAllItems() +{ + pageItem()->clear(); + m_commandsList.clear(); +} + +void PageDesignIntf::setItemMode(BaseDesignIntf::ItemMode state) +{ + m_itemMode = state; + foreach(QGraphicsItem * item, items()) { + BaseDesignIntf *reportItem = dynamic_cast(item); + + if (reportItem) { + reportItem->setItemMode(itemMode()); + } + } +} + +BaseDesignIntf* PageDesignIntf::reportItemByName(const QString &name) +{ + + foreach(QGraphicsItem * item, items()) { + BaseDesignIntf *bd = dynamic_cast(item); + if (bd && (bd->objectName().compare(name, Qt::CaseInsensitive) == 0)) return bd; + } + + return 0; +} + +QList PageDesignIntf::reportItemsByName(const QString &name){ + QList result; + foreach(QGraphicsItem * item, items()) { + BaseDesignIntf *bd = dynamic_cast(item); + if (bd && (bd->objectName().compare(name, Qt::CaseInsensitive) == 0)) result.append(bd); + } + return result; +} + +void CommandIf::addCommand(Ptr command, bool execute) +{ + Q_UNUSED(command) + Q_UNUSED(execute) +} + +CommandIf::Ptr InsertItemCommand::create(PageDesignIntf *page, const QString &itemType, QPointF pos, QSizeF size) +{ + InsertItemCommand *command = new InsertItemCommand(); + command->setPage(page); + command->setType(itemType); + command->setPos(pos); + command->setSize(size); + return CommandIf::Ptr(command); +} + +bool InsertItemCommand::doIt() +{ + BaseDesignIntf *item = page()->addReportItem(m_itemType, m_pos, m_size); + if (item) m_itemName = item->objectName(); + return item != 0; +} + +void InsertItemCommand::undoIt() +{ + BaseDesignIntf *item = page()->reportItemByName(m_itemName); + if (item){ + page()->removeReportItem(item,false); + } +// page()->removeItem(item); +// delete item; +} + +CommandIf::Ptr DeleteItemCommand::create(PageDesignIntf *page, BaseDesignIntf *item) +{ + DeleteItemCommand *command = new DeleteItemCommand(); + //QScopedPointer writer(new XMLWriter()); + //writer->putItem(item); + command->setPage(page); + command->setItem(item); + LayoutDesignIntf* layout = dynamic_cast(item->parent()); + if (layout) + command->m_layoutName = layout->objectName(); + //command->m_itemXML = writer->saveToString(); + return CommandIf::Ptr(command); +} + +bool DeleteItemCommand::doIt() +{ + BaseDesignIntf *item = page()->reportItemByName(m_itemName); + if (item) { + item->beforeDelete(); + page()->removeItem(item); + page()->emitItemRemoved(item); + delete item; + return true; + } + return false; +} + +void DeleteItemCommand::undoIt() +{ + BaseDesignIntf *item = page()->createReportItem(m_itemType); + ItemsReaderIntf::Ptr reader = StringXMLreader::create(m_itemXML); + if (reader->first()) reader->readItem(item); + BandDesignIntf* band = dynamic_cast(item); + if (band){ + bool increaseBandIndex = false; + BandDesignIntf* parentBand = dynamic_cast(page()->reportItemByName(band->parentBandName())); + band->setBandIndex(page()->pageItem()->calcBandIndex(band->bandType(), parentBand, increaseBandIndex)); + if (increaseBandIndex) + page()->pageItem()->increaseBandIndex(band->bandIndex()); + } + page()->registerItem(item); + + if (!m_layoutName.isEmpty()) { + LayoutDesignIntf* layout = dynamic_cast(page()->reportItemByName(m_layoutName)); + if (layout){ + layout->restoreChild(item); + } + page()->emitRegisterdItem(item); + } +} + +void DeleteItemCommand::setItem(BaseDesignIntf *value) +{ + m_itemName = value->objectName(); + m_itemType = value->storageTypeName(); + QScopedPointer writer(new XMLWriter()); + writer->putItem(value); + m_itemXML = writer->saveToString(); +} + +CommandIf::Ptr DeleteLayoutCommand::create(PageDesignIntf *page, LayoutDesignIntf *item) +{ + DeleteLayoutCommand* command = new DeleteLayoutCommand(); + command->setPage(page); + command->setItem(item); + foreach (BaseDesignIntf* item, item->childBaseItems()){ + command->m_childItems.append(item->objectName()); + } + return CommandIf::Ptr(command); +} + +bool DeleteLayoutCommand::doIt() +{ + BaseDesignIntf *item = page()->reportItemByName(m_itemName); + if (item) { + item->beforeDelete(); + QScopedPointer writer(new XMLWriter()); + writer->putItem(item); + m_itemXML = writer->saveToString(); + page()->removeItem(item); + page()->emitItemRemoved(item); + delete item; + return true; + } + return false; +} + +void DeleteLayoutCommand::undoIt() +{ + BaseDesignIntf *item = page()->addReportItem(m_itemType); + ItemsReaderIntf::Ptr reader = StringXMLreader::create(m_itemXML); + if (reader->first()) reader->readItem(item); + foreach(QString ci, m_childItems){ + BaseDesignIntf* ri = page()->reportItemByName(ci); + if (ri){ + dynamic_cast(item)->addChild(ri); + } + page()->emitRegisterdItem(item); + } +} + +void DeleteLayoutCommand::setItem(BaseDesignIntf *item) +{ + m_itemName = item->objectName(); + m_itemType = item->storageTypeName(); +} + +CommandIf::Ptr PasteCommand::create(PageDesignIntf *page, const QString &itemsXML, BaseDesignIntf *parent) +{ + PasteCommand *command = new PasteCommand(); + command->setPage(page); + command->setItemsXML(itemsXML); + command->setParent(parent); + return CommandIf::Ptr(command); +} + +bool PasteCommand::doIt() +{ + m_itemNames.clear(); + ItemsReaderIntf::Ptr reader = StringXMLreader::create(m_itemsXML); + + if (reader->first() && reader->itemType() == "Object") { + insertItem(reader); + + while (reader->next()) { + insertItem(reader); + } + } + + else return false; + + page()->selectedItems().clear(); + foreach(QString name, m_itemNames) { + page()->reportItemByName(name)->setSelected(true); + } + return m_itemNames.count() > 0; +} + +void PasteCommand::undoIt() +{ + foreach(QString name, m_itemNames) { + BaseDesignIntf *item = page()->reportItemByName(name); + page()->emitItemRemoved(item); + page()->removeItem(item); + delete item; + } +} + +void PasteCommand::setItemsXML(const QString &itemsXML) +{ + m_itemsXML = itemsXML; +} + +bool PasteCommand::insertItem(ItemsReaderIntf::Ptr reader) +{ + BaseDesignIntf* parentItem = page()->reportItemByName(m_parentItemName); + if (parentItem){ + BaseDesignIntf *item = page()->addReportItem(reader->itemClassName(), parentItem, parentItem); + if (item) { + m_itemNames.push_back(item->objectName()); + reader->readItem(item); + item->setParent(parentItem); + item->setParentItem(parentItem); + item->setObjectName(m_itemNames.last()); + } + return true; + } + return false; +} + +CommandIf::Ptr CutCommand::create(PageDesignIntf *page) +{ + CutCommand *command = new CutCommand(); + command->setPage(page); + ItemsWriterIntf *writer = new XMLWriter(); + foreach(QGraphicsItem * item, page->selectedItems()) { + BaseDesignIntf *reportItem = dynamic_cast(item); + + if (reportItem) { + command->m_itemNames.push_back(reportItem->objectName()); + writer->putItem(reportItem); + } + } + command->setXML(writer->saveToString()); + + if (command->m_itemNames.count() > 0) { + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(writer->saveToString()); + } + + return CommandIf::Ptr(command); +} + +bool CutCommand::doIt() +{ + foreach(QString name, m_itemNames) { + BaseDesignIntf *item = page()->reportItemByName(name); + page()->removeItem(item); + page()->emitItemRemoved(item); + delete item; + } + return m_itemNames.count() > 0; +} + +void CutCommand::undoIt() +{ + ItemsReaderIntf::Ptr reader = StringXMLreader::create(m_itemsXML); + + if (reader->first()) { + BaseDesignIntf *item = page()->addReportItem(reader->itemClassName()); + + if (item) reader->readItem(item); + + while (reader->next()) { + item = page()->addReportItem(reader->itemClassName()); + + if (item) reader->readItem(item); + } + } +} + +CommandIf::Ptr PosChangedCommand::create(PageDesignIntf *page, QVector &oldPos, QVector &newPos) +{ + PosChangedCommand *command = new PosChangedCommand(); + command->setPage(page); + command->m_newPos = newPos; + command->m_oldPos = oldPos; + return CommandIf::Ptr(command); +} + +bool PosChangedCommand::doIt() +{ + for (int i = 0; i < m_newPos.count(); i++) { + BaseDesignIntf *reportItem = page()->reportItemByName(m_newPos[i].objectName); + + if (reportItem && (reportItem->pos() != m_newPos[i].pos)) reportItem->setPos(m_newPos[i].pos); + } + + return true; +} + +void PosChangedCommand::undoIt() +{ + for (int i = 0; i < m_oldPos.count(); i++) { + BaseDesignIntf *reportItem = page()->reportItemByName(m_oldPos[i].objectName); + + if (reportItem && (reportItem->pos() != m_oldPos[i].pos)) reportItem->setPos(m_oldPos[i].pos); + } +} + +CommandIf::Ptr SizeChangedCommand::create(PageDesignIntf *page, QVector &oldSize, QVector &newSize) +{ + SizeChangedCommand *command = new SizeChangedCommand(); + command->setPage(page); + command->m_newSize = newSize; + command->m_oldSize = oldSize; + return CommandIf::Ptr(command); +} + +bool SizeChangedCommand::doIt() +{ + for (int i = 0; i < m_newSize.count(); i++) { + BaseDesignIntf *reportItem = page()->reportItemByName(m_newSize[i].objectName); + + if (reportItem && (reportItem->size() != m_newSize[i].size)) reportItem->setSize(m_newSize[i].size); + } + + return true; +} + +void SizeChangedCommand::undoIt() +{ + for (int i = 0; i < m_oldSize.count(); i++) { + BaseDesignIntf *reportItem = page()->reportItemByName(m_oldSize[i].objectName); + + if (reportItem && (reportItem->size() != m_oldSize[i].size)) reportItem->setSize(m_oldSize[i].size); + } +} + +CommandIf::Ptr PropertyChangedCommand::create(PageDesignIntf *page, const QString &objectName, const QString &propertyName, + const QVariant &oldValue, const QVariant &newValue) +{ + PropertyChangedCommand *command = new PropertyChangedCommand(); + command->setPage(page); + command->m_objectName = objectName; + command->m_propertyName = propertyName; + command->m_oldValue = oldValue; + command->m_newValue = newValue; + return CommandIf::Ptr(command); +} + +bool PropertyChangedCommand::doIt() +{ + BaseDesignIntf *reportItem = page()->reportItemByName(m_objectName); + + if (reportItem && (reportItem->property(m_propertyName.toLatin1()) != m_newValue)) { + reportItem->setProperty(m_propertyName.toLatin1(), m_newValue); + } + + return true; +} + +void PropertyChangedCommand::undoIt() +{ + BaseDesignIntf *reportItem = page()->reportItemByName(m_objectName); + + if (reportItem && (reportItem->property(m_propertyName.toLatin1()) != m_oldValue)) { + reportItem->setProperty(m_propertyName.toLatin1(), m_oldValue); + } +} + +CommandIf::Ptr InsertBandCommand::create(PageDesignIntf *page, const QString &bandName) +{ + InsertBandCommand *command = new InsertBandCommand(); + command->setPage(page); + BandDesignIntf *band = dynamic_cast(page->reportItemByName(bandName)); + command->m_bandType = band->bandType(); + command->m_bandName = band->objectName(); + if (band->parentBand()) + command->m_parentBandName = band->parentBandName(); + return CommandIf::Ptr(command); +} + +bool InsertBandCommand::doIt() +{ + if (!m_parentBandName.isEmpty() && page()->reportItemByName(m_parentBandName)) + page()->reportItemByName(m_parentBandName)->setSelected(true); + BaseDesignIntf *item = page()->addBand(m_bandType); + + if (item) { + m_bandName = item->objectName(); + return true; + } + + return false; +} + +void InsertBandCommand::undoIt() +{ + BaseDesignIntf *item = page()->reportItemByName(m_bandName); + + if (item) { + page()->removeReportItem(item,false); + } +} + +CommandIf::Ptr CommandGroup::create() +{ + return CommandIf::Ptr(new CommandGroup); +} + +bool CommandGroup::doIt() +{ + foreach(CommandIf::Ptr command, m_commands) { + if (!command->doIt()) + return false; + } + return true; +} + +void CommandGroup::undoIt() +{ + foreach(CommandIf::Ptr command, m_commands) { + command->undoIt(); + } +} + +void CommandGroup::addCommand(CommandIf::Ptr command, bool execute) +{ + if (execute && command->doIt()) + m_commands.append(command); + + else + m_commands.append(command); +} + +PrintRange::PrintRange(QAbstractPrintDialog::PrintRange rangeType, int fromPage, int toPage) + :m_rangeType(rangeType), m_fromPage(fromPage), m_toPage(toPage) +{} + +CommandIf::Ptr InsertHLayoutCommand::create(PageDesignIntf *page) +{ + InsertHLayoutCommand *command = new InsertHLayoutCommand(); + command->setPage(page); + + QList si = page->selectedItems(); + QList::iterator it = si.begin(); + + BaseDesignIntf* parentItem = dynamic_cast((*it)->parentItem()); + command->m_oldParentName = (parentItem)?(parentItem->objectName()):""; + + for(it = si.begin();it!=si.end();++it){ + BaseDesignIntf* bi = dynamic_cast(*it); + if (bi) + command->m_elements.insert(bi->objectName(),bi->pos()); + } + + return CommandIf::Ptr(command); +} + +bool InsertHLayoutCommand::doIt() +{ + foreach (QString itemName, m_elements.keys()) { + BaseDesignIntf* bi = page()->reportItemByName(itemName); + if (bi) + bi->setSelected(true); + } + LayoutDesignIntf* layout = page()->internalAddHLayout(); + if (layout) + m_layoutName = layout->objectName(); + return layout != 0; +} + +void InsertHLayoutCommand::undoIt() +{ + HorizontalLayout* layout = dynamic_cast(page()->reportItemByName(m_layoutName)); + if (layout){ + foreach(QGraphicsItem* item, layout->childBaseItems()){ + BaseDesignIntf* bi = dynamic_cast(item); + BaseDesignIntf* parent = page()->reportItemByName(m_oldParentName); + if (bi && parent){ + bi->setParentItem(parent); + bi->setParent(parent); + bi->setPos(m_elements.value(bi->objectName())); + } + } + page()->removeReportItem(layout,false); + } +} + +CommandIf::Ptr PropertyObjectNameChangedCommand::create(PageDesignIntf *page, const QString &oldValue, const QString &newValue) +{ + PropertyObjectNameChangedCommand *command = new PropertyObjectNameChangedCommand(); + command->setPage(page); + command->m_oldName = oldValue; + command->m_newName = newValue; + return CommandIf::Ptr(command); +} + +bool PropertyObjectNameChangedCommand::doIt() +{ + BaseDesignIntf *reportItem = page()->reportItemByName(m_oldName); + + if (reportItem ) { + reportItem->setObjectName(m_newName); + reportItem->emitObjectNamePropertyChanged(m_oldName,m_newName); + return true; + } + return false; +} + +void PropertyObjectNameChangedCommand::undoIt() +{ + BaseDesignIntf *reportItem = page()->reportItemByName(m_newName); + + if (reportItem ) { + reportItem->setObjectName(m_oldName); + reportItem->emitObjectNamePropertyChanged(m_newName,m_oldName); + } + +} + +} + diff --git a/src/lrpagedesignintf.h b/src/lrpagedesignintf.h new file mode 100644 index 0000000..17f1509 --- /dev/null +++ b/src/lrpagedesignintf.h @@ -0,0 +1,409 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRPAGEDEDIGNITF_H +#define LRPAGEDEDIGNITF_H + +#include +#include + +#include "lrpageitemdesignintf.h" +#include "serializators/lrstorageintf.h" +#include "lrbanddesignintf.h" + +namespace LimeReport { + + class BaseDesignIntf; + class ReportEnginePrivate; + class PropertyChangedCommand; + class HorizontalLayout; + class LayoutDesignIntf; + + class CommandIf { + public: + virtual ~CommandIf(){} + typedef QSharedPointer Ptr; + virtual bool doIt() = 0; + virtual void undoIt() = 0; + virtual void addCommand(CommandIf::Ptr command,bool execute); + }; + + typedef QList::const_iterator BandsIterator; + + struct ReportItemPos{ + QString objectName; + QPointF pos; + }; + + struct ReportItemSize{ + QString objectName; + QSizeF size; + }; + + class PageDesignIntf : public QGraphicsScene, public ObjectLoadingStateIntf{ + Q_OBJECT + Q_PROPERTY(QObject* pageItem READ pageItem()) + public: + friend class PropertyChangedCommand; + friend class InsertHLayoutCommand; + enum Orientation {Portrait, Landscape}; + enum PageSize {A4, B5, Letter, Legal, Executive, + A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, + B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, + DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom + }; + + explicit PageDesignIntf(QObject* parent = 0); + ~PageDesignIntf(); + void updatePageRect(); + Orientation getOrientation(); + + void setPageSize(PageSize sizeType, QSizeF sizeValue=QSizeF()); + PageSize pageSize() const; + + void startInsertMode(const QString& ItemType); + void startEditMode(); + + PageItemDesignIntf *pageItem(); + void setPageItem(PageItemDesignIntf::Ptr pageItem); + void setPageItems(QList pages); + + bool isItemInsertMode(); + ReportEnginePrivate* reportEditor(); + void setReportEditor(ReportEnginePrivate* value){m_reportEditor=value;} + + QStringList posibleParentItems(); + void registerItem(BaseDesignIntf* item); + void registerBand(BandDesignIntf* band); + void removeAllItems(); + + void setItemMode(BaseDesignIntf::ItemMode state); + BaseDesignIntf::ItemMode itemMode(){return m_itemMode;} + BaseDesignIntf* reportItemByName(const QString& name); + QList reportItemsByName(const QString &name); + BaseDesignIntf* addReportItem(const QString& itemType, QPointF pos, QSizeF size); + BaseDesignIntf* addReportItem(const QString& itemType, QObject *owner=0, BaseDesignIntf *parent=0); + BaseDesignIntf* createReportItem(const QString& itemType, QObject *owner=0, BaseDesignIntf *parent=0); + void removeReportItem(BaseDesignIntf* item, bool createComand = true); + bool saveCommand(CommandIf::Ptr command, bool runCommand = true); + + bool isCanRedo(); + bool isCanUndo(); + bool isHasChanges(); + + void reactivatePageItem(PageItemDesignIntf::Ptr pageItem); + + void setSettings(QSettings* settings){ m_settings = settings;} + QSettings* settings(){ return m_settings;} + + QString genObjectName(const QObject& object); + + void animateItem(BaseDesignIntf* item); + void setSelectionRect(QRectF selectionRect); + void emitRegisterdItem(BaseDesignIntf *item); + void emitItemRemoved(BaseDesignIntf* item); + + + protected: + + virtual void keyPressEvent(QKeyEvent *event); + virtual void keyReleaseEvent(QKeyEvent *event); + virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + + virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event); + virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *); + virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event); + virtual void dropEvent(QGraphicsSceneDragDropEvent *event); + + LimeReport::BandDesignIntf::BandsType findPriorType(LimeReport::BandDesignIntf::BandsType bandType); + + + bool isExistsObjectName (const QString& objectName) const; + QRectF getRectByPageSize(PageSize pageSize); + + bool isLoading(); + void objectLoadStarted(); + void objectLoadFinished(); + + HorizontalLayout* internalAddHLayout(); + signals: + void geometryChanged(QRectF newGeometry); + void insertModeStarted(); + void itemInserted(LimeReport::PageDesignIntf* report, QPointF pos, const QString& ItemType); + void itemInsertCanceled(const QString& ItemType); + void itemSelected(LimeReport::BaseDesignIntf *item); + void multiItemsSelected(QList* objectsList); + void commandHistoryChanged(); + void itemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant& oldValue, const QVariant& newValue); + void itemAdded(LimeReport::PageDesignIntf* report, LimeReport::BaseDesignIntf* item); + void itemRemoved(LimeReport::PageDesignIntf* report, LimeReport::BaseDesignIntf* item); + void bandAdded(LimeReport::PageDesignIntf* report, LimeReport::BandDesignIntf* band); + void bandRemoved(LimeReport::PageDesignIntf* report, LimeReport::BandDesignIntf* band); + public slots: + BaseDesignIntf* addBand(const QString& bandType); + BaseDesignIntf* addBand(BandDesignIntf::BandsType bandType); + void removeBand(LimeReport::BandDesignIntf* band); + void bandGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); + void bandPosChanged(QObject* object, QPointF newPos, QPointF oldPos); + void slotUpdateItemSize(); + void undo(); + void redo(); + void copy(); + void paste(); + void deleteSelected(); + void cut(); + void setToSaved(); + void bringToFront(); + void sendToBack(); + void alignToLeft(); + void alignToRigth(); + void alignToVCenter(); + void alignToTop(); + void alignToBottom(); + void alignToHCenter(); + void sameWidth(); + void sameHeight(); + void addHLayout(); + void setFont(const QFont &font); + void setTextAlign(const Qt::Alignment& alignment); + void setBorders(const BaseDesignIntf::BorderLines& border); + private slots: + void slotPageGeomertyChanged(QObject*, QRectF, QRectF ); + void slotItemPropertyChanged(QString propertyName, const QVariant &oldValue, const QVariant &newValue); + void slotItemPropertyObjectNameChanged(const QString& oldName, const QString& newName); + void bandDeleted(QObject* band); + void slotPageItemLoaded(QObject *); + void slotSelectionChanged(); + void slotAnimationStoped(QObject *animation); + private: + template + BaseDesignIntf* internalAddBand(T bandType); + void finalizeInsertMode(); + void saveSelectedItemsPos(); + void saveSelectedItemsGeometry(); + void checkSizeOrPosChanges(); + void createChangePosCommand(); + void createChangeSizeCommand(); + void saveChangeProppertyCommand(const QString& objectName, const QString& propertyName, const QVariant& oldPropertyValue, const QVariant& newPropertyValue); + void changeSelectedGroupProperty(const QString& name,const QVariant& value); + private: + PageSize m_pageSize; + QSizeF m_pageSizeValue; + Orientation m_orientation; + QRectF m_geometry; + LimeReport::PageItemDesignIntf::Ptr m_pageItem; + QList m_reportPages; + ReportEnginePrivate* m_reportEditor; + bool m_insertMode; + QGraphicsItem * m_itemInsertRect; + QString m_insertItemType; + BaseDesignIntf::ItemMode m_itemMode; + QGraphicsRectItem* m_cutterBorder; + QGraphicsRectItem* m_pageRect; + QVector m_commandsList; + QVector m_positionStamp; + QVector m_geometryStamp; + BaseDesignIntf* m_firstSelectedItem; + int m_currentCommand; + bool m_changeSizeMode; + bool m_changePosMode; + bool m_changePosOrSizeMode; + bool m_executingCommand; + bool m_hasHanges; + bool m_isLoading; + bool m_executingGroupCommand; + QSettings* m_settings; + QList m_animationList; + QPointF m_startSelectionPoint; + QGraphicsRectItem* m_selectionRect; + }; + + class AbstractPageCommand : public CommandIf{ + public: + void setPage(PageDesignIntf* value){m_page = value;} + PageDesignIntf* page(){return m_page;} + private: + PageDesignIntf* m_page; + }; + + class InsertHLayoutCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page); + bool doIt(); + void undoIt(); + private: + InsertHLayoutCommand(){} + private: + QString m_layoutName; + QString m_oldParentName; + QMap m_elements; + }; + + class InsertItemCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, const QString& itemType, QPointF pos, QSizeF size); + bool doIt(); + void undoIt(); + void setPos(QPointF& value){m_pos = value;} + QPointF pos(){return m_pos;} + void setSize(QSizeF& value){m_size=value;} + QSizeF size(){return m_size;} + void setType(const QString& value){m_itemType=value;} + private: + InsertItemCommand(){} + private: + QPointF m_pos; + QSizeF m_size; + QString m_itemType; + QString m_itemName; + }; + + class InsertBandCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page,const QString& bandName); + bool doIt(); + void undoIt(); + private: + BandDesignIntf::BandsType m_bandType; + QString m_bandName; + QString m_parentBandName; + }; + + class DeleteItemCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, BaseDesignIntf* item); + bool doIt(); + void undoIt(); + void setType(const QString& value){m_itemType=value;} + void setXml(const QString& value){m_itemXML=value;} + void setItem(BaseDesignIntf* value); + private: + QString m_itemXML; + QString m_itemType; + QString m_itemName; + QString m_layoutName; + }; + + class DeleteLayoutCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, LayoutDesignIntf* item); + bool doIt(); + void undoIt(); + protected: + void setItem(BaseDesignIntf* item); + private: + QStringList m_childItems; + QString m_itemXML; + QString m_itemType; + QString m_itemName; + }; + + + class PasteCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, const QString& itemsXML, BaseDesignIntf *parent); + bool doIt(); + void undoIt(); + protected: + void setItemsXML(const QString& itemsXML); + void setParent(BaseDesignIntf* parent){m_parentItemName = parent->objectName();} + bool insertItem(ItemsReaderIntf::Ptr reader); + private: + QString m_itemsXML; + QString m_parentItemName; + QVector m_itemNames; + }; + + class CutCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page); + bool doIt(); + void undoIt(); + void setXML(const QString& value){m_itemsXML=value;} + private: + QString m_itemsXML; + QVector m_itemNames; + }; + + class PosChangedCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, QVector& oldPos, QVector& newPos); + bool doIt(); + void undoIt(); + private: + QVector m_oldPos; + QVector m_newPos; + }; + + class SizeChangedCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, QVector& oldSize, QVector& newSize); + bool doIt(); + void undoIt(); + private: + QVector m_oldSize; + QVector m_newSize; + }; + + class PropertyChangedCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, const QString& objectName, const QString& propertyName, const QVariant& oldValue, const QVariant& newValue); + bool doIt(); + void undoIt(); + private: + QString m_objectName; + QString m_propertyName; + QVariant m_oldValue; + QVariant m_newValue; + }; + + class PropertyObjectNameChangedCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page, const QString &oldValue, const QString &newValue); + bool doIt(); + void undoIt(); + private: + QString m_oldName; + QString m_newName; + }; + + class CommandGroup : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(); + bool doIt(); + void undoIt(); + void addCommand(CommandIf::Ptr command,bool execute); + private: + QList m_commands; + }; + +} +#endif //LRPAGEDEDIGNITF_H diff --git a/src/lrpageitemdesignintf.cpp b/src/lrpageitemdesignintf.cpp new file mode 100644 index 0000000..7862e6e --- /dev/null +++ b/src/lrpageitemdesignintf.cpp @@ -0,0 +1,486 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrpageitemdesignintf.h" +#include "lrbanddesignintf.h" +#include +#include + +namespace LimeReport { + +bool bandSortBandLessThenByIndex(const BandDesignIntf *c1, const BandDesignIntf *c2){ + if (c1->bandIndex()!=c2->bandIndex()){ + return c1->bandIndex()bandIndex(); + } else { + return c1->bandType()bandType(); + } +} + +PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : + BaseDesignIntf("PageItem",owner,parent), + m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), + m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false) +{ + setFixedPos(true); + setPosibleResizeDirectionFlags(Fixed); + initPageSize(m_pageSize); +} + +PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &rect, QObject *owner, QGraphicsItem *parent) : + BaseDesignIntf("PageItem",owner,parent), + m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), + m_pageOrientaion(Portrait), m_pageSize(pageSize), m_sizeChainging(false) +{ + setFixedPos(true); + setPosibleResizeDirectionFlags(Fixed); + initPageSize(rect.size()); +} + +PageItemDesignIntf::~PageItemDesignIntf() +{ + foreach(BandDesignIntf* band,m_bands) band->disconnect(this); + m_bands.clear(); +} + +void PageItemDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + + if (itemMode() & DesignMode){ + ppainter->save(); + ppainter->setOpacity(0.8); + ppainter->fillRect(boundingRect(),pageBorderColor()); + ppainter->setOpacity(1); + ppainter->fillRect(pageRect(),Qt::white); + paintGrid(ppainter); + ppainter->setPen(gridColor()); + ppainter->drawRect(boundingRect()); + ppainter->restore(); + } + + if (itemMode() & PreviewMode) { + ppainter->save(); + ppainter->fillRect(rect(),Qt::white); + QPen pen; + pen.setColor(Qt::gray); + pen.setWidth(2); + pen.setStyle(Qt::DotLine); + ppainter->setPen(pen); + QRectF tmpRect = rect(); + tmpRect.adjust(-4,-4,4,4); + ppainter->drawRect(tmpRect); + ppainter->restore(); + BaseDesignIntf::paint(ppainter,option,widget); + } +} + +BaseDesignIntf *PageItemDesignIntf::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new PageItemDesignIntf(owner,parent); +} + +void PageItemDesignIntf::geometryChangedEvent(QRectF newRect, QRectF) +{ +// if (scene()) +// scene()->setSceneRect(newRect); + Q_UNUSED(newRect) + updateMarginRect(); + PageSize oldSize = m_pageSize; + if (!m_sizeChainging && !isLoading()) + m_pageSize = Custom; + notify("pageSize",oldSize,m_pageSize); +} + +QColor PageItemDesignIntf::selectionColor() const +{ + return Qt::gray; +} + +QColor PageItemDesignIntf::pageBorderColor() const +{ + //return QColor(180,220,150); + return QColor(100,150,50); +} + +QColor PageItemDesignIntf::gridColor() const +{ + //return QColor(240,240,240); + return QColor(170,200,150); +} + +void PageItemDesignIntf::clear() +{ + foreach(QGraphicsItem* item, childItems()){ + delete item; + } + childItems().clear(); + m_bands.clear(); +} + +BandDesignIntf *PageItemDesignIntf::bandByType(BandDesignIntf::BandsType bandType) const +{ + QList::const_iterator it = childBands().constBegin(); + for(;it!=childBands().constEnd();++it){ + if ( (*it)->bandType()==bandType) return (*it); + } return 0; +} + +bool PageItemDesignIntf::isBandExists(BandDesignIntf::BandsType bandType) +{ + foreach(BandDesignIntf* band,childBands()){ + if (band->bandType()==bandType) return true; + } + return false; +} + +bool PageItemDesignIntf::isBandExists(const QString &bandType) +{ + foreach(BandDesignIntf* band, m_bands){ + if (band->bandTitle()==bandType) return true; + } + return false; +} + +BandDesignIntf* PageItemDesignIntf::bandByIndex(int index) +{ + foreach(BandDesignIntf* band,m_bands){ + if (band->bandIndex()==index) return band; + } + return 0; +} + +BandDesignIntf *PageItemDesignIntf::bandByName(QString bandObjectName) +{ + foreach(BandDesignIntf* band, childBands()){ + if (band->objectName().compare(bandObjectName,Qt::CaseInsensitive)==0){ + return band; + } + } + return 0; +} + +int PageItemDesignIntf::calcBandIndex(BandDesignIntf::BandsType bandType, BandDesignIntf *parentBand, bool& increaseBandIndex) +{ + + increaseBandIndex = false; + QSet subDetailsBands; + subDetailsBands << BandDesignIntf::SubDetailBand << BandDesignIntf::SubDetailHeader << BandDesignIntf::SubDetailFooter; + + int bandIndex=-1; + qSort(m_bands.begin(),m_bands.end(),bandSortBandLessThenByIndex); + foreach(BandDesignIntf* band,m_bands){ + if ((band->bandType()==BandDesignIntf::GroupHeader)&&(band->bandType()>bandType)) break; + if ((band->bandType()>bandType)&&(band->parentBand()==0)) break; + if (bandIndexbandIndex()) bandIndex=band->bandIndex()+1; + } + + if (bandIndex==-1) { + bandIndex = (int)(bandType); + increaseBandIndex = true; + } + + if (parentBand) { + switch (bandType) { + case BandDesignIntf::SubDetailBand: + bandIndex = parentBand->bandIndex() + 1; + increaseBandIndex = true; + break; + case BandDesignIntf::SubDetailHeader: + bandIndex = parentBand->bandIndex(); + increaseBandIndex = true; + break; + case BandDesignIntf::SubDetailFooter: + bandIndex = parentBand->maxChildIndex(subDetailsBands) + 1; + increaseBandIndex = true; + break; + case BandDesignIntf::GroupHeader: + bandIndex = parentBand->groupHeaderIndex(); + increaseBandIndex = true; + break; + case BandDesignIntf::GroupFooter: + bandIndex = parentBand->parentBand()->groupFooterIndex(parentBand->bandIndex()) + 1; + increaseBandIndex = true; + break; + default : + ; + } + + } + return bandIndex; +} + +void PageItemDesignIntf::increaseBandIndex(int startIndex) +{ + if (bandByIndex(startIndex)){ + foreach(BandDesignIntf* band,m_bands){ + if (band->bandIndex()>=startIndex){ + band->setBandIndex(band->bandIndex()+1); + } + } + } +} + +bool PageItemDesignIntf::isBandRegistred(BandDesignIntf *band) +{ + foreach(BandDesignIntf* cBand,childBands()){ + if (band==cBand) return true; + } + return false; +} + +void PageItemDesignIntf::registerBand(BandDesignIntf *band) +{ + if (!isBandRegistred(band)){ + if (band->bandIndex()>childBands().count()-1) + m_bands.append(band); + else + m_bands.insert(band->bandIndex(),band); + + band->setParent(this); + band->setParentItem(this); + band->setWidth(pageRect().width()); + connect(band, SIGNAL(destroyed(QObject*)),this,SLOT(bandDeleted(QObject*))); + connect(band, SIGNAL(geometryChanged(QObject*,QRectF,QRectF)),this,SLOT(bandGeometryChanged(QObject*,QRectF,QRectF))); + } +} + +void PageItemDesignIntf::relocateBands() +{ + if (isLoading()) return; + + int bandSpace = (itemMode() & DesignMode)?4:0; + + qSort(m_bands.begin(),m_bands.end(),bandSortBandLessThenByIndex); + + if (m_bands.count()>0) m_bands[0]->setPos(pageRect().x(),pageRect().y()); + if(m_bands.count()>1){ + m_bands[0]->setBandIndex(0); + for(int i=0;i<(m_bands.count()-1);i++){ + if ((m_bands[i+1]->bandType()!=BandDesignIntf::PageFooter) || (itemMode() & DesignMode)) + m_bands[i+1]->setPos(pageRect().x(),m_bands[i]->pos().y()+m_bands[i]->height()+bandSpace); + m_bands[i+1]->setBandIndex(i+1); + } + } +} + +void PageItemDesignIntf::removeBand(BandDesignIntf *band) +{ + if (!m_bands.isEmpty()){ + m_bands.removeOne(band); + } +} + +int PageItemDesignIntf::dataBandCount() +{ + int count=0; + foreach(BandDesignIntf* band,m_bands){ + if (band->bandType()==BandDesignIntf::Data) count++; + } + return count; +} + +BandDesignIntf *PageItemDesignIntf::dataBandAt(int index) +{ + int count=0; + qSort(m_bands.begin(),m_bands.end(),bandSortBandLessThenByIndex); + foreach(BandDesignIntf* band,m_bands){ + if (band->bandType()==BandDesignIntf::Data){ + if(count==index) return band; + count++; + } + } + return 0; +} + +void PageItemDesignIntf::setTopMargin(int value) +{ + if (m_topMargin!=value){ + int oldValue = m_topMargin; + m_topMargin=value; + updateMarginRect(); + notify("topMargin",oldValue,value); + } +} + +void PageItemDesignIntf::setBottomMargin(int value) +{ + if (m_bottomMargin!=value){ + int oldValue = m_bottomMargin; + m_bottomMargin=value; + updateMarginRect(); + notify("bottomMargin",oldValue,value); + } +} + +void PageItemDesignIntf::setLeftMargin(int value) +{ + if (m_leftMargin!=value){ + int oldValue = m_leftMargin; + m_leftMargin=value; + updateMarginRect(); + notify("leftMargin",oldValue,value); + } +} + +void PageItemDesignIntf::setRightMargin(int value) +{ + if (m_rightMargin!=value){ + int oldValue = m_rightMargin; + m_rightMargin=value; + updateMarginRect(); + notify("rightMargin",oldValue,value); + } +} + +void PageItemDesignIntf::setPageOrientation(PageItemDesignIntf::Orientation value) +{ + if (!m_sizeChainging && m_pageOrientaion!=value){ + m_sizeChainging = true; + m_pageOrientaion = value; + if (!isLoading()){ + qreal tmpWidth = width(); + setWidth(height()); + setHeight(tmpWidth); + } + m_sizeChainging = false; + } +} + +QSizeF PageItemDesignIntf::getRectByPageSize(const PageSize& size) +{ + if (size != Custom) { + QPrinter printer; + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setOrientation((QPrinter::Orientation)pageOrientation()); + printer.setPageSize((QPrinter::PageSize)size); + return QSizeF(printer.paperRect(QPrinter::Millimeter).width() * 10, + printer.paperSize(QPrinter::Millimeter).height() * 10); + } + + else { + return QSizeF(width(),height()); + } +} + +void PageItemDesignIntf::initPageSize(const QSizeF& size) +{ + m_sizeChainging = true; + setWidth(size.width()); + setHeight(size.height()); + m_sizeChainging=false; +} +void PageItemDesignIntf::initPageSize(const PageItemDesignIntf::PageSize &size) +{ + m_sizeChainging = true; + if (m_pageSize != Custom){ + QSizeF pageSize = getRectByPageSize(size); + setWidth(pageSize.width()); + setHeight(pageSize.height()); + } + m_sizeChainging=false; +} + +void PageItemDesignIntf::setPageSize(const PageSize &size) +{ + if(m_pageSize!=size){ + m_pageSize=size; + initPageSize(m_pageSize); + } +} + +void PageItemDesignIntf::bandDeleted(QObject *band) +{ + removeBand(reinterpret_cast(band)); + relocateBands(); +} + +void PageItemDesignIntf::bandGeometryChanged(QObject *, QRectF /*newGeometry*/, QRectF /*oldGeometry*/) +{ + relocateBands(); +} + +void PageItemDesignIntf::collectionLoadFinished(const QString &collectionName) +{ + if (collectionName.compare("children",Qt::CaseInsensitive)==0){ + m_bands.clear(); +#ifdef HAVE_QT5 + foreach(QObject* obj,children()){ +#else + foreach(QObject* obj,QObject::children()){ +#endif + BandDesignIntf* item = dynamic_cast(obj); + if (item) { + registerBand(item); + } + } + } + BaseDesignIntf::collectionLoadFinished(collectionName); +} + +void PageItemDesignIntf::updateMarginRect() +{ + m_pageRect = rect(); + m_pageRect.adjust(m_leftMargin*mmFactor(),m_topMargin*mmFactor(), + -m_rightMargin*mmFactor(),-m_bottomMargin*mmFactor()); + foreach(BandDesignIntf* band,m_bands){ + band->setWidth(pageRect().width()); + relocateBands(); + } + update(); +} + +void PageItemDesignIntf::paintGrid(QPainter *ppainter) +{ + ppainter->save(); + ppainter->setPen(QPen(gridColor())); + ppainter->setOpacity(0.5); + for (int i=0;i<=(pageRect().height()-50)/100;i++){ + ppainter->drawLine(pageRect().x(),(i*100)+pageRect().y()+50,pageRect().right(),i*100+pageRect().y()+50); + }; + for (int i=0;i<=((pageRect().width()-50)/100);i++){ + ppainter->drawLine(i*100+pageRect().x()+50,pageRect().y(),i*100+pageRect().x()+50,pageRect().bottom()); + }; + + ppainter->setPen(QPen(gridColor())); + ppainter->setOpacity(1); + for (int i=0;i<=(pageRect().width()/100);i++){ + ppainter->drawLine(i*100+pageRect().x(),pageRect().y(),i*100+pageRect().x(),pageRect().bottom()); + }; + for (int i=0;i<=pageRect().height()/100;i++){ + ppainter->drawLine(pageRect().x(),i*100+pageRect().y(),pageRect().right(),i*100+pageRect().y()); + }; + ppainter->drawRect(pageRect()); + ppainter->restore(); +} + +PageItemDesignIntf::Ptr PageItemDesignIntf::create(QObject *owner) +{ + return PageItemDesignIntf::Ptr(new PageItemDesignIntf(owner)); +} + +} diff --git a/src/lrpageitemdesignintf.h b/src/lrpageitemdesignintf.h new file mode 100644 index 0000000..079b621 --- /dev/null +++ b/src/lrpageitemdesignintf.h @@ -0,0 +1,127 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRPAGEITEM_H +#define LRPAGEITEM_H +#include "lrbasedesignintf.h" +#include "lrbanddesignintf.h" +#include +#include + +namespace LimeReport{ + +class ReportRender; +class PageItemDesignIntf : public LimeReport::BaseDesignIntf +{ + Q_OBJECT + Q_ENUMS(Orientation) + Q_ENUMS(PageSize) + Q_PROPERTY(int topMargin READ topMargin WRITE setTopMargin) + Q_PROPERTY(int bottomMargin READ bottomMargin WRITE setBottomMargin) + Q_PROPERTY(int rightMargin READ rightMargin WRITE setRightMargin) + Q_PROPERTY(int leftMargin READ leftMargin WRITE setLeftMargin) + Q_PROPERTY(Orientation pageOrientation READ pageOrientation WRITE setPageOrientation) + Q_PROPERTY(PageSize pageSize READ pageSize WRITE setPageSize ) + friend class ReportRender; +public: + enum Orientation { Portrait, Landscape }; + enum PageSize {A4, B5, Letter, Legal, Executive, + A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, + B10, B2, B3, B4, B6, B7, B8, B9, C5E, Comm10E, + DLE, Folio, Ledger, Tabloid, Custom, NPageSize = Custom + }; + typedef QList BandsList; + typedef QList::const_iterator BandsIterator; + typedef QSharedPointer Ptr; + static PageItemDesignIntf::Ptr create(QObject* owner); + explicit PageItemDesignIntf(QObject *owner = 0, QGraphicsItem* parent=0); + explicit PageItemDesignIntf(const PageSize pageSize, const QRectF& rect,QObject *owner = 0, QGraphicsItem* parent=0); + ~PageItemDesignIntf(); + virtual void paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget); + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); + virtual void geometryChangedEvent(QRectF newRect, QRectF); + virtual QColor selectionColor() const; + virtual QColor pageBorderColor() const; + virtual QColor gridColor() const; + void clear(); + const BandsList& childBands() const {return m_bands;} + BandDesignIntf * bandByType(BandDesignIntf::BandsType bandType) const; + bool isBandExists(BandDesignIntf::BandsType bandType); + bool isBandExists(const QString& bandType); + BandDesignIntf* bandByIndex(int index); + BandDesignIntf* bandByName(QString bandObjectName); + int calcBandIndex(BandDesignIntf::BandsType bandType, BandDesignIntf* parentBand, bool &increaseBandIndex); + void increaseBandIndex(int startIndex); + bool isBandRegistred(BandDesignIntf* band); + void registerBand(BandDesignIntf* band); + void relocateBands(); + void removeBand(BandDesignIntf* band); + + int dataBandCount(); + BandDesignIntf* dataBandAt(int index); + + void setTopMargin(int value); + int topMargin() const {return m_topMargin;} + void setBottomMargin(int value); + int bottomMargin() const {return m_bottomMargin;} + void setLeftMargin(int value); + int leftMargin() const {return m_leftMargin;} + void setRightMargin(int value); + int rightMargin() const{return m_rightMargin;} + + void setPageOrientation(Orientation value); + Orientation pageOrientation() const {return m_pageOrientaion;} + PageSize pageSize() const {return m_pageSize;} + void setPageSize(const PageSize &size); + +protected slots: + void bandDeleted(QObject* band); + void bandGeometryChanged(QObject* /*object*/, QRectF newGeometry, QRectF oldGeometry); +protected: + void collectionLoadFinished(const QString& collectionName); + QRectF& pageRect(){return m_pageRect;} + void updateMarginRect(); + QSizeF getRectByPageSize(const PageSize &size); + void initPageSize(const PageSize &size); + void initPageSize(const QSizeF &size); +private: + void paintGrid(QPainter *ppainter); +private: + int m_topMargin; + int m_bottomMargin; + int m_leftMargin; + int m_rightMargin; + Orientation m_pageOrientaion; + PageSize m_pageSize; + QRectF m_pageRect; + bool m_sizeChainging; + QList m_bands; +}; +} +#endif // LRPAGEITEM_H diff --git a/src/lrpreviewreportwindow.cpp b/src/lrpreviewreportwindow.cpp new file mode 100644 index 0000000..5c4ba90 --- /dev/null +++ b/src/lrpreviewreportwindow.cpp @@ -0,0 +1,410 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrpreviewreportwindow.h" +#include "ui_lrpreviewreportwindow.h" +#include "serializators/lrxmlreader.h" +#include "serializators/lrxmlwriter.h" +#include "lrreportengine_p.h" + +#include +#include +#include +#include + +PreviewReportWindow::PreviewReportWindow(ReportEnginePrivate *report,QWidget *parent, QSettings *settings, Qt::WindowFlags flags) : + QMainWindow(parent,flags), + ui(new Ui::PreviewReportWindow), m_currentPage(1), m_changingPage(false), m_settings(settings), m_ownedSettings(false), + m_priorScrolValue(0) +{ + ui->setupUi(this); + setWindowTitle("Lime Report Preview"); + m_previewPage = report->createPreviewPage(); + m_previewPage->setItemMode( LimeReport::PreviewMode ); + m_pagesNavigator = new QSpinBox(this); + m_pagesNavigator->setMaximum(10000000); + m_pagesNavigator->setPrefix("Page: "); + m_pagesNavigator->setMinimumWidth(120); + ui->toolBar->insertWidget(ui->actionNextPage,m_pagesNavigator); + m_simpleScene = new QGraphicsScene(this); + ui->actionShowMessages->setVisible(false); + ui->errorsView->setVisible(false); + connect(m_pagesNavigator,SIGNAL(valueChanged(int)),this,SLOT(slotPageNavigatorChanged(int))); + connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int))); + connect(ui->actionShowMessages, SIGNAL(triggered()), this, SLOT(slotShowErrors())); + restoreSetting(); +} + +void PreviewReportWindow::writeSetting() +{ + settings()->beginGroup("PreviewWindow"); + settings()->setValue("Geometry",saveGeometry()); + settings()->setValue("State",saveState()); + settings()->endGroup(); +} + +void PreviewReportWindow::restoreSetting() +{ + settings()->beginGroup("PreviewWindow"); + QVariant v = settings()->value("Geometry"); + if (v.isValid()){ + restoreGeometry(v.toByteArray()); + } + v = settings()->value("State"); + if (v.isValid()){ + restoreState(v.toByteArray()); + } + settings()->endGroup(); +} + + +PreviewReportWindow::~PreviewReportWindow() +{ + if (m_ownedSettings) + delete m_settings; + delete ui; +} + +void PreviewReportWindow::initPreview(int pagesCount) +{ + m_pagesNavigator->setSuffix(tr(" of %1").arg(pagesCount)); + m_pagesNavigator->setMinimum(1); + m_pagesNavigator->setMaximum(pagesCount); + ui->graphicsView->setScene(m_previewPage); + ui->graphicsView->centerOn(0, 0); + ui->graphicsView->scale(0.5,0.5); + m_currentPage=1; + m_pagesNavigator->setValue(m_currentPage); +} + +void PreviewReportWindow::setSettings(QSettings* value) +{ + if (m_ownedSettings) + delete m_settings; + m_settings=value; + m_ownedSettings=false; + restoreSetting(); +} + +void PreviewReportWindow::setErrorMessages(const QStringList &value){ + ui->actionShowMessages->setVisible(true); + foreach (QString line, value) { + ui->errorsView->append(line); + } +} + +QSettings*PreviewReportWindow::settings() +{ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings = true; + return m_settings; + } +} + +void PreviewReportWindow::setReportReader(ItemsReaderIntf::Ptr reader) +{ + m_reader=reader; + if (!reader.isNull()){ + if (reader->first()) reader->readItem(m_previewPage->pageItem()); + int pagesCount = reader->firstLevelItemsCount(); + m_previewPage->pageItem()->setItemMode(PreviewMode); + initPreview(pagesCount); + } +} + +void PreviewReportWindow::setPages(ReportPages pages) +{ + m_reportPages = pages; + if (!m_reportPages.isEmpty()){ + //m_previewPage->setPageItem(m_reportPages.at(0)); + m_previewPage->setPageItems(m_reportPages); + m_changingPage = true; + initPreview(m_reportPages.count()); + m_currentPage = 1; + if (pages.at(0)) pages.at(0)->setSelected(true); + m_changingPage = false; + } +} + +void PreviewReportWindow::exec() +{ + bool deleteOnClose = testAttribute(Qt::WA_DeleteOnClose); + setAttribute(Qt::WA_DeleteOnClose,false); + setAttribute(Qt::WA_ShowModal,true); + show(); + m_eventLoop.exec(); + if (deleteOnClose) delete this; +} + +void PreviewReportWindow::closeEvent(QCloseEvent *) +{ +#ifdef Q_OS_WIN + writeSetting(); +#endif +#ifdef Q_OS_MAC + writeSetting(); +#endif + m_eventLoop.exit(); +} + +void PreviewReportWindow::resizeEvent(QResizeEvent* e) +{ +#ifdef Q_OS_UNIX + if (e->oldSize()!=e->size()){ + writeSetting(); + } +#else + Q_UNUSED(e) +#endif +} + +void PreviewReportWindow::moveEvent(QMoveEvent* e) +{ +#ifdef Q_OS_UNIX + if (e->oldPos()!=e->pos()){ + writeSetting(); + } +#else + Q_UNUSED(e) +#endif +} + +void PreviewReportWindow::slotPrint() +{ + QPrinter printer(QPrinter::HighResolution); + QPrintDialog dialog(&printer,QApplication::activeWindow()); + if (dialog.exec()==QDialog::Accepted){ + if (!m_reportPages.isEmpty()) + ReportEnginePrivate::printReport( + m_reportPages, + printer, + PrintRange(dialog.printRange(),dialog.fromPage(),dialog.toPage()) + ); + else ReportEnginePrivate::printReport(m_reader,printer); + foreach(PageItemDesignIntf::Ptr pageItem, m_reportPages){ + m_previewPage->reactivatePageItem(pageItem); + } + + } +} + +void PreviewReportWindow::slotPriorPage() +{ + m_changingPage=true; + if ((!m_reportPages.isEmpty())&&(m_currentPage>1)){ + m_currentPage--; + //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); + ui->graphicsView->ensureVisible( + calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 + ); + m_pagesNavigator->setValue(m_currentPage); + } else { + if (reader() && reader()->prior()){ + m_previewPage->removeAllItems(); + reader()->readItem(m_previewPage->pageItem()); + m_currentPage--; + m_pagesNavigator->setValue(m_currentPage); + } + } + m_changingPage=false; +} + +void PreviewReportWindow::slotNextPage() +{ + m_changingPage=true; + if ((!m_reportPages.isEmpty())&&(m_reportPages.count()>(m_currentPage))){ + m_currentPage++; + //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); + ui->graphicsView->ensureVisible( + calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 + ); + m_pagesNavigator->setValue(m_currentPage); + } else { + if (reader() && reader()->next()){ + m_previewPage->removeAllItems(); + reader()->readItem(m_previewPage->pageItem()); + m_currentPage++; + m_pagesNavigator->setValue(m_currentPage); + } + } + m_changingPage=false; +} + +void PreviewReportWindow::slotZoomIn() +{ + ui->graphicsView->scale(1.2,1.2); +} + +void PreviewReportWindow::slotZoomOut() +{ + ui->graphicsView->scale(1/1.2,1/1.2); +} + +void PreviewReportWindow::slotPageNavigatorChanged(int value) +{ + if (m_changingPage) return; + m_changingPage = true; + if ((!m_reportPages.isEmpty())&&(m_reportPages.count() >= value)){ + m_currentPage = value; + //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); + ui->graphicsView->ensureVisible( + calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 + ); + } else { + if (reader()){ + int direction = (m_currentPage>value)?-1:1; + while (m_currentPage != value){ + if (direction == 1) reader()->next(); + else reader()->prior(); + m_currentPage += direction; + } + m_previewPage->removeAllItems(); + reader()->readItem(m_previewPage->pageItem()); + m_pagesNavigator->setValue(m_currentPage); + } + } + m_changingPage=false; +} + +void PreviewReportWindow::slotShowErrors() +{ + ui->errorsView->setVisible(ui->actionShowMessages->isChecked()); +} + +ItemsReaderIntf *PreviewReportWindow::reader() +{ + return m_reader.data(); +} + +bool PreviewReportWindow::pageIsVisible(PageItemDesignIntf::Ptr page) +{ + return page->mapToScene(page->rect()).boundingRect().intersects( + ui->graphicsView->mapToScene(ui->graphicsView->viewport()->geometry()).boundingRect() + ); +} + +QRectF PreviewReportWindow::calcPageShift(PageItemDesignIntf::Ptr page) +{ + qreal pageHeight = page->mapToScene(page->boundingRect()).boundingRect().height(); + qreal viewHeight = ui->graphicsView->mapToScene( + 0,ui->graphicsView->viewport()->height() + ).y()-ui->graphicsView->mapToScene(0,0).y(); + viewHeight = (pageHeightmapRectToScene( + m_reportPages.at(m_currentPage-1)->rect() + ); + return QRectF(0,pageStartPos.y(),0,viewHeight); +} + +void PreviewReportWindow::on_actionSaveToFile_triggered() +{ + QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name")); + if (!fileName.isEmpty()){ + QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + foreach (PageItemDesignIntf::Ptr page, m_reportPages){ + writer->putItem(page.data()); + } + writer->saveToFile(fileName); + } +} + +void PreviewReportWindow::slotFirstPage() +{ + m_changingPage=true; + if ((!m_reportPages.isEmpty())&&(m_currentPage>1)){ + m_currentPage=1; + //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); + ui->graphicsView->ensureVisible( + calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 + ); + m_pagesNavigator->setValue(m_currentPage); + } else { + if (reader() && reader()->prior()){ + while (reader()->prior()) { + } + m_previewPage->removeAllItems(); + reader()->readItem(m_previewPage->pageItem()); + m_currentPage=1; + m_pagesNavigator->setValue(m_currentPage); + } + } + m_changingPage=false; +} + +void PreviewReportWindow::slotLastPage() +{ + m_changingPage=true; + if ((!m_reportPages.isEmpty())&&(m_reportPages.count()>(m_currentPage))){ + m_currentPage=m_reportPages.count(); + //m_previewPage->setPageItem(m_reportPages.at(m_currentPage-1)); + ui->graphicsView->ensureVisible( + calcPageShift(m_reportPages.at(m_currentPage-1)), 0, 0 + ); + m_pagesNavigator->setValue(m_currentPage); + } else { + + if (reader() && reader()->next()){ + m_currentPage++; + while (reader()->next()) { + m_currentPage++; + } + m_previewPage->removeAllItems(); + reader()->readItem(m_previewPage->pageItem()); + m_pagesNavigator->setValue(m_currentPage); + } + } + m_changingPage=false; +} + +void PreviewReportWindow::slotSliderMoved(int value) +{ + if (ui->graphicsView->verticalScrollBar()->minimum()==value){ + m_currentPage = 1; + } else if (ui->graphicsView->verticalScrollBar()->maximum()==value){ + m_currentPage = m_reportPages.count(); + } + + if (!pageIsVisible(m_reportPages.at(m_currentPage-1))){ + if (value>m_priorScrolValue){ + m_currentPage++; + } else { + m_currentPage--; + } + } + + m_changingPage = true; + m_pagesNavigator->setValue(m_currentPage); + m_changingPage = false; + m_priorScrolValue = value; + +} + diff --git a/src/lrpreviewreportwindow.h b/src/lrpreviewreportwindow.h new file mode 100644 index 0000000..d6f1bef --- /dev/null +++ b/src/lrpreviewreportwindow.h @@ -0,0 +1,97 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRPREVIEWREPORTWINDOW_H +#define LRPREVIEWREPORTWINDOW_H + +#include +#include +#include + +#include "lrpagedesignintf.h" +#include "lrreportrender.h" +#include "serializators/lrstorageintf.h" +#include "serializators/lrxmlreader.h" + +namespace Ui { +class PreviewReportWindow; +} +using namespace LimeReport; +class PreviewReportWindow : public QMainWindow +{ + Q_OBJECT +public: + explicit PreviewReportWindow(ReportEnginePrivate *report, QWidget *parent = 0, QSettings* settings=0, Qt::WindowFlags flags=0); + ~PreviewReportWindow(); + void setReportReader(ItemsReaderIntf::Ptr reader); + void setPages(ReportPages pages); + void exec(); + void initPreview(int pagesCount); + void setSettings(QSettings* value); + void setErrorMessages(const QStringList& value); + QSettings* settings(); +protected: + void writeSetting(); + void restoreSetting(); + void closeEvent(QCloseEvent *); + void resizeEvent(QResizeEvent *e); + void moveEvent(QMoveEvent *e); +public slots: + void slotPrint(); + void slotPriorPage(); + void slotNextPage(); + void slotZoomIn(); + void slotZoomOut(); + void slotPageNavigatorChanged(int value); + void slotShowErrors(); + void on_actionSaveToFile_triggered(); + void slotFirstPage(); + void slotLastPage(); +private slots: + void slotSliderMoved(int value); +private: + ItemsReaderIntf* reader(); + bool pageIsVisible(PageItemDesignIntf::Ptr page); + QRectF calcPageShift(PageItemDesignIntf::Ptr page); +private: + Ui::PreviewReportWindow *ui; + QSpinBox* m_pagesNavigator; + QSharedPointer m_reader; + int m_currentPage; + PageDesignIntf* m_previewPage; + QGraphicsScene* m_simpleScene; + ReportPages m_reportPages; + QEventLoop m_eventLoop; + bool m_changingPage; + QSettings* m_settings; + bool m_ownedSettings; + int m_priorScrolValue; +}; + +#endif // LRPREVIEWREPORTWINDOW_H diff --git a/src/lrpreviewreportwindow.ui b/src/lrpreviewreportwindow.ui new file mode 100644 index 0000000..b4e2870 --- /dev/null +++ b/src/lrpreviewreportwindow.ui @@ -0,0 +1,367 @@ + + + PreviewReportWindow + + + + 0 + 0 + 800 + 600 + + + + Preview + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + + + + + + + + + 0 + 0 + 800 + 20 + + + + + View + + + + + + + Report + + + + + + + + + + toolBar + + + + 16 + 16 + + + + TopToolBarArea + + + false + + + + + + + + + + + + + + + + + + + :/report/images/print:/report/images/print + + + Print + + + Ctrl+P + + + + + + :/report/images/zoomIn:/report/images/zoomIn + + + Zoom In + + + + + + :/report/images/zoomOut:/report/images/zoomOut + + + Zoom Out + + + + + + :/report/images/prior:/report/images/prior + + + Prior Page + + + Prior Page + + + + + + :/report/images/next:/report/images/next + + + Next Page + + + Next Page + + + + + + :/report/images/closebox:/report/images/closebox + + + Close Preview + + + Close Preview + + + + + true + + + + :/report/images/edit:/report/images/edit + + + Edit Mode + + + + + + :/report/images/save:/report/images/save + + + Save to file + + + Save to file + + + + + true + + + + :/databrowser/images/error_message_2.png:/databrowser/images/error_message_2.png + + + Show errors + + + Show errors + + + + + + :/report/images/first:/report/images/first + + + First Page + + + First page + + + + + + :/report/images/last:/report/images/last + + + Last Page + + + Last Page + + + + + + + + + + actionPrint + triggered() + PreviewReportWindow + slotPrint() + + + -1 + -1 + + + 399 + 299 + + + + + actionPriorPage + triggered() + PreviewReportWindow + slotPriorPage() + + + -1 + -1 + + + 399 + 299 + + + + + actionNextPage + triggered() + PreviewReportWindow + slotNextPage() + + + -1 + -1 + + + 399 + 299 + + + + + actionZoomIn + triggered() + PreviewReportWindow + slotZoomIn() + + + -1 + -1 + + + 399 + 299 + + + + + actionZoomOut + triggered() + PreviewReportWindow + slotZoomOut() + + + -1 + -1 + + + 399 + 299 + + + + + actionClosePreview + triggered() + PreviewReportWindow + close() + + + -1 + -1 + + + 399 + 299 + + + + + actionFirst_Page + triggered() + PreviewReportWindow + slotFirstPage() + + + -1 + -1 + + + 399 + 299 + + + + + actionLast_Page + triggered() + PreviewReportWindow + slotLastPage() + + + -1 + -1 + + + 399 + 299 + + + + + + slotNextPage() + slotPriorPage() + slotZoomIn() + slotZoomOut() + slotPrint() + slotFirstPage() + slotLastPage() + + diff --git a/src/lrreportdesignwidget.cpp b/src/lrreportdesignwidget.cpp new file mode 100644 index 0000000..ec1453c --- /dev/null +++ b/src/lrreportdesignwidget.cpp @@ -0,0 +1,361 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrreportdesignwidget.h" +#include "serializators/lrxmlreader.h" +#include "serializators/lrxmlwriter.h" +#include "lrreportengine_p.h" +#include "lrbasedesignintf.h" + +#include +#include +#include +#include +#include +#include + + +namespace LimeReport { + +// ReportDesignIntf +ReportDesignWidget* ReportDesignWidget::m_instance=0; + +ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) : + QWidget(parent), m_mainWindow(mainWindow) +{ + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(1,1,1,1); + m_view = new QGraphicsView(qobject_cast(this)); + m_view->setBackgroundBrush(QBrush(Qt::gray)); + mainLayout->addWidget(m_view); + setLayout(mainLayout); + + if (!report) { + m_report=new ReportEnginePrivate(this); + m_report->setObjectName("report"); + m_report->appendPage("page1"); + } + else { + m_report=report; + if (!m_report->pageCount()) m_report->appendPage("page1"); + } + + setActivePage(m_report->pageAt(0)); + foreach(QGraphicsItem* item, activePage()->selectedItems()){ + item->setSelected(false); + } + connect(m_report,SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); + connect(m_report,SIGNAL(cleared()),this,SIGNAL(cleared())); + m_view->scale(0.5,0.5); + m_instance=this; +} + +ReportDesignWidget::~ReportDesignWidget() +{ m_instance=0;} + +void ReportDesignWidget::setActivePage(PageDesignIntf *page) +{ + m_view->setScene(page); + connect(page,SIGNAL(itemInserted(LimeReport::PageDesignIntf*,QPointF,QString)),this,SIGNAL(itemInserted(LimeReport::PageDesignIntf*,QPointF,QString))); + connect(page,SIGNAL(itemInsertCanceled(QString)),this,SIGNAL(itemInsertCanceled(QString))); + connect(page,SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)),this,SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant))); + connect(page,SIGNAL(selectionChanged()),this,SLOT(slotSelectionChanged())); + connect(page,SIGNAL(insertModeStarted()),this,SIGNAL(insertModeStarted())); + connect(page,SIGNAL(commandHistoryChanged()),this,SIGNAL(commandHistoryChanged())); + connect(page,SIGNAL(sceneRectChanged(QRectF)),this,SLOT(slotSceneRectChanged(QRectF))); + + connect(page,SIGNAL(itemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), + this, SIGNAL(itemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*))); + connect(page,SIGNAL(itemRemoved(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), + this,SIGNAL(itemDeleted(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*))); + connect(page,SIGNAL(bandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + this, SIGNAL(bandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); + connect(page, SIGNAL(bandRemoved(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + this, SIGNAL(bandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); + + + + m_view->centerOn(0, 0); + emit activePageChanged(); +} + +void ReportDesignWidget::createStartPage() +{ + PageDesignIntf* reportPage = m_report->appendPage("page1"); + setActivePage(reportPage); +} + +void ReportDesignWidget::removeDatasource(const QString &datasourceName) +{ + m_report->dataManager()->removeDatasource(datasourceName); +} + +void ReportDesignWidget::addBand(const QString &bandType) +{ + activePage()->addBand(bandType); +} + +void ReportDesignWidget::addBand(BandDesignIntf::BandsType bandType) +{ + activePage()->addBand(bandType); +} + +void ReportDesignWidget::startInsertMode(const QString &itemType) +{ + activePage()->startInsertMode(itemType); +} + +void ReportDesignWidget::startEditMode() +{ + activePage()->startEditMode(); +} + +PageDesignIntf * ReportDesignWidget::activePage() +{ + return qobject_cast(m_view->scene()); +} + +QList ReportDesignWidget::selectedItems(){ + return m_view->scene()->selectedItems(); +} + +void ReportDesignWidget::deleteItem(QGraphicsItem *item){ + activePage()->removeReportItem(dynamic_cast(item)); +} + +void ReportDesignWidget::deleteSelectedItems(){ + foreach(QGraphicsItem *item,activePage()->selectedItems()) deleteItem(item); +} + +QStringList ReportDesignWidget::datasourcesNames(){ + return m_report->dataManager()->dataSourceNames(); +} + +void ReportDesignWidget::slotItemSelected(BaseDesignIntf *item){ + emit itemSelected(item); +} + +void ReportDesignWidget::saveToFile(const QString &fileName){ + m_report->saveToFile(fileName); +} + +bool ReportDesignWidget::save() +{ + if (!m_report->reportFileName().isEmpty()){ + return m_report->saveToFile(); + } + else { + return m_report->saveToFile(QFileDialog::getSaveFileName(this,tr("Report file name"),"","Report files (*.lrxml);; All files (*)")); + } +} + +void ReportDesignWidget::loadFromFile(const QString &fileName) +{ + m_report->loadFromFile(fileName); + setActivePage(m_report->pageAt(0)); +} + +void ReportDesignWidget::scale(qreal sx, qreal sy) +{ + m_view->scale(sx,sy); +} + +QString ReportDesignWidget::reportFileName() +{ + return m_report->reportFileName(); +} + +bool ReportDesignWidget::isNeedToSave() +{ + return m_report->isNeedToSave(); +} + +void ReportDesignWidget::updateSize() +{ + activePage()->slotUpdateItemSize(); +} + +void ReportDesignWidget::undo() +{ + activePage()->undo(); +} + +void ReportDesignWidget::redo() +{ + activePage()->redo(); +} + +void ReportDesignWidget::copy() +{ + activePage()->copy(); +} + +void ReportDesignWidget::paste() +{ + activePage()->paste(); +} + +void ReportDesignWidget::cut() +{ + activePage()->cut(); +} + +void ReportDesignWidget::brinToFront() +{ + activePage()->bringToFront(); +} + +void ReportDesignWidget::sendToBack() +{ + activePage()->sendToBack(); +} + +void ReportDesignWidget::alignToLeft() +{ + activePage()->alignToLeft(); +} + +void ReportDesignWidget::alignToRight() +{ + activePage()->alignToRigth(); +} + +void ReportDesignWidget::alignToVCenter() +{ + activePage()->alignToVCenter(); +} + +void ReportDesignWidget::alignToTop() +{ + activePage()->alignToTop(); +} + +void ReportDesignWidget::alignToBottom() +{ + activePage()->alignToBottom(); +} + +void ReportDesignWidget::alignToHCenter() +{ + activePage()->alignToHCenter(); +} + +void ReportDesignWidget::sameHeight() +{ + activePage()->sameHeight(); +} + +void ReportDesignWidget::sameWidth() +{ + activePage()->sameWidth(); +} + +void ReportDesignWidget::editLayoutMode(bool value) +{ + if (value ){ + activePage()->pageItem()->setItemMode(activePage()->pageItem()->itemMode() | LayoutEditMode); + } else if (activePage()->pageItem()->itemMode() & LayoutEditMode){ + activePage()->pageItem()->setItemMode(activePage()->pageItem()->itemMode() ^ LayoutEditMode); + } +} + +void ReportDesignWidget::addHLayout() +{ + activePage()->addHLayout(); +} + +void ReportDesignWidget::setFont(const QFont& font) +{ + activePage()->setFont(font); +} + +void ReportDesignWidget::setTextAlign(const Qt::Alignment& alignment) +{ + activePage()->setTextAlign(alignment); +} + +void ReportDesignWidget::setBorders(const BaseDesignIntf::BorderLines& borders) +{ + activePage()->setBorders(borders); +} + +bool ReportDesignWidget::isCanUndo() +{ + return activePage()->isCanUndo(); +} + +bool ReportDesignWidget::isCanRedo() +{ + return activePage()->isCanRedo(); +} + +void ReportDesignWidget::slotSelectionChanged() +{ + QGraphicsScene* page=dynamic_cast(sender()); + if (page){ + if (page->selectedItems().count()==1){ + BaseDesignIntf* item = dynamic_cast(page->selectedItems().at(0)); + if (item) + emit (itemSelected(item)); + } + else if (page->selectedItems().count()>1){ + emit (multiItemSelected()); + } + } +} + +DataSourceManager* ReportDesignWidget::dataManager() +{ + return m_report->dataManager(); +} + +void ReportDesignWidget::slotPagesLoadFinished() +{ + setActivePage(m_report->pageAt(0)); + emit loaded(); +} + +void ReportDesignWidget::slotDatasourceCollectionLoaded(const QString & /*collectionName*/) +{ +} + +void ReportDesignWidget::slotSceneRectChanged(QRectF) +{ + m_view->centerOn(0,0); +} + +void ReportDesignWidget::clear() +{ + m_report->clearReport(); +} + +} + + + diff --git a/src/lrreportdesignwidget.h b/src/lrreportdesignwidget.h new file mode 100644 index 0000000..7154ad6 --- /dev/null +++ b/src/lrreportdesignwidget.h @@ -0,0 +1,135 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTDESIGNWIDGET_H +#define LRREPORTDESIGNWIDGET_H + +#include +#include +#include + +#include "lrpagedesignintf.h" +#include "lrdatadesignintf.h" +#include "lrdatasourcemanager.h" +#include "lrcollection.h" +#include "lrreportengine_p.h" + + +namespace LimeReport { + +class ReportEnginePrivate; +class DataBrowser; +class ReportDesignWindow; + +class ReportDesignWidget : public QWidget +{ + Q_OBJECT + Q_PROPERTY(QObject* datasourcesManager READ dataManager()) + friend class ReportDesignWindow; +public: + ~ReportDesignWidget(); + static ReportDesignWidget* instance(){return m_instance;} + void createStartPage(); + void clear(); + DataSourceManager* dataManager(); + void removeDatasource(const QString& datasourceName); + void addBand(const QString& bandType); + void addBand(BandDesignIntf::BandsType bandType); + void startInsertMode(const QString& itemType); + void startEditMode(); + void updateSize(); + bool isCanUndo(); + bool isCanRedo(); + void deleteItem(QGraphicsItem *item); + PageDesignIntf* activePage(); + QList selectedItems(); + QStringList datasourcesNames(); + void scale( qreal sx, qreal sy); +// void setDatabrowser(DataBrowser* databrowser); + ReportEnginePrivate* report(){return m_report;} + QString reportFileName(); + bool isNeedToSave(); +public slots: + void saveToFile(const QString&); + bool save(); + void loadFromFile(const QString&); + void deleteSelectedItems(); + void setActivePage(PageDesignIntf* page); + void undo(); + void redo(); + void copy(); + void paste(); + void cut(); + void brinToFront(); + void sendToBack(); + void alignToLeft(); + void alignToRight(); + void alignToVCenter(); + void alignToTop(); + void alignToBottom(); + void alignToHCenter(); + void sameHeight(); + void sameWidth(); + void editLayoutMode(bool value); + void addHLayout(); + void setFont(const QFont &font); + void setTextAlign(const Qt::Alignment& alignment); + void setBorders(const BaseDesignIntf::BorderLines& borders); +private slots: + void slotItemSelected(LimeReport::BaseDesignIntf *item); + void slotSelectionChanged(); + void slotPagesLoadFinished(); + void slotDatasourceCollectionLoaded(const QString&); + void slotSceneRectChanged(QRectF); +signals: + void insertModeStarted(); + void itemInserted(LimeReport::PageDesignIntf*,QPointF,const QString&); + void itemInsertCanceled(const QString&); + void itemSelected(LimeReport::BaseDesignIntf *item); + void itemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant& oldValue, const QVariant& newValue); + void multiItemSelected(); + void commandHistoryChanged(); + void cleared(); + void loaded(); + void activePageChanged(); + void bandAdded(LimeReport::PageDesignIntf*, LimeReport::BandDesignIntf*); + void bandDeleted(LimeReport::PageDesignIntf*, LimeReport::BandDesignIntf*); + void itemAdded(LimeReport::PageDesignIntf*, LimeReport::BaseDesignIntf*); + void itemDeleted(LimeReport::PageDesignIntf*, LimeReport::BaseDesignIntf*); +private: + ReportDesignWidget(ReportEnginePrivate* report,QMainWindow *mainWindow,QWidget *parent = 0); +private: + ReportEnginePrivate* m_report; + QGraphicsView *m_view; + QMainWindow *m_mainWindow; + static ReportDesignWidget* m_instance; +}; + +} +#endif // LRREPORTDESIGNWIDGET_H diff --git a/src/lrreportdesignwindow.cpp b/src/lrreportdesignwindow.cpp new file mode 100644 index 0000000..89a5615 --- /dev/null +++ b/src/lrreportdesignwindow.cpp @@ -0,0 +1,908 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lrreportdesignwindow.h" +#include "lrbandsmanager.h" +#include "lrobjectinspectorwidget.h" +#include "lrbasedesignobjectmodel.h" +#include "lrreportdesignwidget.h" +#include "lrdatabrowser.h" +#include "lrbasedesignintf.h" +#include "lrpagedesignintf.h" + +#include "waitform.h" +#include "lrpreviewreportwindow.h" +#include "serializators/lrstorageintf.h" +#include "serializators/lrxmlreader.h" +#include "objectsbrowser/lrobjectbrowser.h" +#include "lraboutdialog.h" + + +namespace LimeReport{ + +ReportDesignWindow* ReportDesignWindow::m_instance=0; + +ReportDesignWindow::ReportDesignWindow(ReportEnginePrivate *report, QWidget *parent, QSettings* settings) : + QMainWindow(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), m_progressDialog(0), m_showProgressDialog(true) +{ + initReportEditor(report); + createActions(); + createMainMenu(); + createToolBars(); + createObjectInspector(); + createDataWindow(); + createObjectsBrowser(); + m_instance=this; + m_statusBar=new QStatusBar(this); + m_lblReportName = new QLabel(report->reportFileName(),this); + m_statusBar->insertWidget(0,m_lblReportName); + setStatusBar(m_statusBar); + setWindowTitle("Lime Report Designer"); + restoreSetting(); +} + +ReportDesignWindow::~ReportDesignWindow() +{ + m_instance=0; + delete m_validator; + if (m_ownedSettings&&m_settings) delete m_settings; +} + +void ReportDesignWindow::createActions() +{ + m_newReportAction = new QAction(tr("New Report"),this); + m_newReportAction->setIcon(QIcon(":/report/images/newReport")); + m_newReportAction->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_N)); + connect(m_newReportAction,SIGNAL(triggered()),this,SLOT(slotNewReport())); + + m_editModeAction = new QAction(tr("Edit Mode"),this); + m_editModeAction->setIcon(QIcon(":/report/images/editMode")); + m_editModeAction->setCheckable(true); + m_editModeAction->setChecked(true); + connect(m_editModeAction,SIGNAL(triggered()),this,SLOT(slotEditMode())); + + m_undoAction = new QAction(tr("Undo"),this); + m_undoAction->setIcon(QIcon(":/report/images/undo")); + m_undoAction->setEnabled(false); + m_undoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z)); + connect(m_undoAction,SIGNAL(triggered()),this,SLOT(slotUndo())); + + m_redoAction = new QAction(tr("Redo"),this); + m_redoAction->setIcon(QIcon(":/report/images/redo")); + m_redoAction->setEnabled(false); + m_redoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Z)); + connect(m_redoAction,SIGNAL(triggered()),this,SLOT(slotRedo())); + + m_copyAction = new QAction(tr("Copy"),this); + m_copyAction->setIcon(QIcon(":/report/images/copy")); + m_copyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C)); + connect(m_copyAction,SIGNAL(triggered()),this,SLOT(slotCopy())); + + m_pasteAction = new QAction(tr("Paste"),this); + m_pasteAction->setIcon(QIcon(":/report/images/paste")); + m_pasteAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_V)); + connect(m_pasteAction,SIGNAL(triggered()),this,SLOT(slotPaste())); + + m_cutAction = new QAction(tr("Cut"),this); + m_cutAction->setIcon(QIcon(":/report/images/cut")); + m_cutAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_X)); + connect(m_cutAction,SIGNAL(triggered()),this,SLOT(slotCut())); + + m_newTextItemAction = new QAction(tr("Text Item"),this); + m_newTextItemAction->setIcon(QIcon(":/items/TextItem")); + m_actionMap.insert("TextItem",m_newTextItemAction); + connect(m_newTextItemAction,SIGNAL(triggered()),this,SLOT(slotNewTextItem())); + + m_saveReportAction = new QAction(tr("Save Report"),this); + m_saveReportAction->setIcon(QIcon(":/report/images/save")); + m_saveReportAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); + connect(m_saveReportAction,SIGNAL(triggered()),this,SLOT(slotSaveReport())); + + m_saveReportAsAction = new QAction(tr("Save Report As"),this); + m_saveReportAsAction->setIcon(QIcon(":/report/images/saveas")); + m_saveReportAsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_S)); + connect(m_saveReportAsAction,SIGNAL(triggered()),this,SLOT(slotSaveReportAs())); + + m_loadReportAction = new QAction(tr("Load Report"),this); + m_loadReportAction->setIcon(QIcon(":/report/images/folder")); + m_loadReportAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O)); + connect(m_loadReportAction,SIGNAL(triggered()),this,SLOT(slotLoadReport())); + + m_deleteItemAction = new QAction(tr("Delete item"),this); + m_deleteItemAction->setShortcut(QKeySequence("Del")); + m_deleteItemAction->setIcon(QIcon(":/report/images/delete")); + connect(m_deleteItemAction,SIGNAL(triggered()),this,SLOT(slotDelete())); + + m_zoomInReportAction = new QAction(tr("Zoom In"),this); + m_zoomInReportAction->setIcon(QIcon(":/report/images/zoomIn")); + connect(m_zoomInReportAction,SIGNAL(triggered()),this,SLOT(slotZoomIn())); + + m_zoomOutReportAction = new QAction(tr("Zoom Out"),this); + m_zoomOutReportAction->setIcon(QIcon(":/report/images/zoomOut")); + connect(m_zoomOutReportAction,SIGNAL(triggered()),this,SLOT(slotZoomOut())); + + m_previewReportAction = new QAction(tr("Render Report"),this); + m_previewReportAction->setIcon(QIcon(":/report/images/render")); + m_previewReportAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_P)); + connect(m_previewReportAction,SIGNAL(triggered()),this,SLOT(slotPreviewReport())); + + m_testAction = new QAction("test",this); + m_testAction->setIcon(QIcon(":/report/images/pin")); + connect(m_testAction,SIGNAL(triggered()),this,SLOT(slotTest())); + +// m_printReportAction = new QAction(tr("Print Report"),this); +// m_printReportAction->setIcon(QIcon(":/report/images/print")); +// m_printReportAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_P)); +// connect(m_printReportAction,SIGNAL(triggered()),this,SLOT(slotPrintReport())); + + m_editLayoutMode = new QAction(tr("Edit layouts mode"),this); + m_editLayoutMode->setIcon(QIcon(":/report/images/editlayout")); + m_editLayoutMode->setCheckable(true); + connect(m_editLayoutMode,SIGNAL(triggered()),this,SLOT(slotEditLayoutMode())); + + m_addHLayout = new QAction(tr("Horizontal layout"),this); + m_addHLayout->setIcon(QIcon(":/report/images/hlayout")); + connect(m_addHLayout,SIGNAL(triggered()),this,SLOT(slotHLayout())); + + m_aboutAction = new QAction(tr("About"),this); + m_aboutAction->setIcon(QIcon(":/report/images/copyright")); + connect(m_aboutAction,SIGNAL(triggered()),this,SLOT(slotShowAbout())); + +} + +void ReportDesignWindow::createReportToolBar() +{ + m_reportToolBar = new QToolBar(tr("Report Tools"),this); + m_reportToolBar->setIconSize(QSize(24,24)); + m_reportToolBar->addAction(m_editModeAction); + m_reportToolBar->addWidget(m_newBandButton); + m_reportToolBar->addAction(m_newTextItemAction); + m_reportToolBar->setObjectName("reportTools"); + createItemsActions(); + m_reportToolBar->addSeparator(); + //m_reportToolBar->addAction(m_editLayoutMode); + m_reportToolBar->addAction(m_addHLayout); + m_reportToolBar->addSeparator(); + m_reportToolBar->addAction(m_deleteItemAction); + addToolBar(Qt::LeftToolBarArea,m_reportToolBar); +} + +void ReportDesignWindow::createToolBars() +{ + createBandsButton(); + + m_mainToolBar = addToolBar("Main Tools"); + m_mainToolBar->setIconSize(QSize(16,16)); + m_mainToolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea | Qt::TopToolBarArea ); + m_mainToolBar->setFloatable(false); + m_mainToolBar->setObjectName("mainTools"); + + m_mainToolBar->addAction(m_newReportAction); + m_mainToolBar->addAction(m_saveReportAction); + m_mainToolBar->addAction(m_loadReportAction); + m_mainToolBar->addSeparator(); + + m_mainToolBar->addAction(m_copyAction); + m_mainToolBar->addAction(m_pasteAction); + m_mainToolBar->addAction(m_cutAction); + m_mainToolBar->addAction(m_undoAction); + m_mainToolBar->addAction(m_redoAction); + m_mainToolBar->addSeparator(); + + m_mainToolBar->addAction(m_zoomInReportAction); + m_mainToolBar->addAction(m_zoomOutReportAction); + m_mainToolBar->addSeparator(); + + m_mainToolBar->addAction(m_previewReportAction); + //m_mainToolBar->addAction(m_printReportAction); + + m_fontEditorBar = new FontEditorWidget(m_reportDesignWidget,tr("Font"),this); + m_fontEditorBar->setIconSize(m_mainToolBar->iconSize()); + m_fontEditorBar->setObjectName("fontTools"); + addToolBar(m_fontEditorBar); + m_textAlignmentEditorBar = new TextAlignmentEditorWidget(m_reportDesignWidget,tr("Text alignment"),this); + m_textAlignmentEditorBar->setIconSize(m_mainToolBar->iconSize()); + m_textAlignmentEditorBar->setObjectName("textAlignmentTools"); + addToolBar(m_textAlignmentEditorBar); + m_itemsAlignmentEditorBar = new ItemsAlignmentEditorWidget(m_reportDesignWidget,tr("Items alignment"),this); + m_itemsAlignmentEditorBar->setIconSize(m_mainToolBar->iconSize()); + m_itemsAlignmentEditorBar->setObjectName("itemsAlignmentTools"); + addToolBar(m_itemsAlignmentEditorBar); + m_itemsBordersEditorBar = new ItemsBordersEditorWidget(m_reportDesignWidget,tr("Borders"),this); + m_itemsBordersEditorBar->setIconSize(m_mainToolBar->iconSize()); + m_itemsBordersEditorBar->setObjectName("itemsBorederTools"); + addToolBar(m_itemsBordersEditorBar); + + createReportToolBar(); +} + +void ReportDesignWindow::createItemsActions() +{ + foreach(ItemAttribs items,DesignElementsFactory::instance().attribsMap().values()){ + if (items.m_tag.compare("Item",Qt::CaseInsensitive)==0){ + QAction* tmpAction = new QAction(items.m_alias,this); + tmpAction->setWhatsThis(DesignElementsFactory::instance().attribsMap().key(items)); + tmpAction->setIcon(QIcon(":/items/"+tmpAction->whatsThis())); + connect(tmpAction,SIGNAL(triggered()),this,SLOT(slotItemActionCliked())); + m_reportToolBar->addAction(tmpAction); + m_actionMap.insert(tmpAction->whatsThis(),tmpAction); + } + } +} + +void ReportDesignWindow::createBandsButton() +{ + m_newBandButton = new QToolButton(this); + m_newBandButton->setPopupMode(QToolButton::InstantPopup); + m_newBandButton->setIcon(QIcon(":/report/images/addBand")); + + m_bandsAddSignalsMap = new QSignalMapper(this); + + m_newReportHeader=new QAction(QIcon(),tr("Report Header"),this); + connect(m_newReportHeader,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newReportHeader,BandDesignIntf::ReportHeader); + m_newBandButton->addAction(m_newReportHeader); + + m_newReportFooter=new QAction(QIcon(),tr("Report Footer"),this); + connect(m_newReportFooter,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newReportFooter,BandDesignIntf::ReportFooter); + m_newBandButton->addAction(m_newReportFooter); + + m_newPageHeader=new QAction(QIcon(),tr("Page Header"),this); + connect(m_newPageHeader,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newPageHeader,BandDesignIntf::PageHeader); + m_newBandButton->addAction(m_newPageHeader); + + m_newPageFooter=new QAction(QIcon(),tr("Page Footer"),this); + connect(m_newPageFooter,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newPageFooter,BandDesignIntf::PageFooter); + m_newBandButton->addAction(m_newPageFooter); + + m_newData=new QAction(QIcon(),tr("Data"),this); + connect(m_newData,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newData,BandDesignIntf::Data); + m_newBandButton->addAction(m_newData); + + m_newSubDetail=new QAction(QIcon(),tr("SubDetail"),this); + m_newSubDetail->setEnabled(false); + connect(m_newSubDetail,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newSubDetail,BandDesignIntf::SubDetailBand); + m_newBandButton->addAction(m_newSubDetail); + + m_newSubDetailHeader=new QAction(QIcon(),tr("SubDetailHeader"),this); + m_newSubDetailHeader->setEnabled(false); + connect(m_newSubDetailHeader,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newSubDetailHeader,BandDesignIntf::SubDetailHeader); + m_newBandButton->addAction(m_newSubDetailHeader); + + m_newSubDetailFooter=new QAction(QIcon(),tr("SubDetailFooter"),this); + m_newSubDetailFooter->setEnabled(false); + connect(m_newSubDetailFooter,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newSubDetailFooter,BandDesignIntf::SubDetailFooter); + m_newBandButton->addAction(m_newSubDetailFooter); + + m_newGroupHeader=new QAction(QIcon(),tr("GroupHeader"),this); + m_newGroupHeader->setEnabled(false); + connect(m_newGroupHeader,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newGroupHeader,BandDesignIntf::GroupHeader); + m_newBandButton->addAction(m_newGroupHeader); + + m_newGroupFooter=new QAction(QIcon(),tr("GroupFooter"),this); + m_newGroupFooter->setEnabled(false); + connect(m_newGroupFooter,SIGNAL(triggered()),m_bandsAddSignalsMap,SLOT(map())); + m_bandsAddSignalsMap->setMapping(m_newGroupFooter,BandDesignIntf::GroupFooter); + m_newBandButton->addAction(m_newGroupFooter); + + connect(m_bandsAddSignalsMap,SIGNAL(mapped(int)),this,SLOT(slotNewBand(int))); +} + +void ReportDesignWindow::createMainMenu() +{ + m_fileMenu = menuBar()->addMenu(tr("File")); + m_fileMenu->addAction(m_newReportAction); + m_fileMenu->addAction(m_loadReportAction); + m_fileMenu->addAction(m_saveReportAction); + m_fileMenu->addAction(m_saveReportAsAction); + m_fileMenu->addAction(m_previewReportAction); + //m_fileMenu->addAction(m_printReportAction); + m_editMenu = menuBar()->addMenu(tr("Edit")); + m_editMenu->addAction(m_redoAction); + m_editMenu->addAction(m_undoAction); + m_editMenu->addAction(m_copyAction); + m_editMenu->addAction(m_pasteAction); + m_editMenu->addAction(m_cutAction); + m_infoMenu = menuBar()->addMenu(tr("Info")); + m_infoMenu->addAction(m_aboutAction); + +} + +void ReportDesignWindow::initReportEditor(ReportEnginePrivate* report) +{ + m_reportDesignWidget=new ReportDesignWidget(report,this,this); + setCentralWidget(m_reportDesignWidget); + connect(m_reportDesignWidget, SIGNAL(itemSelected(LimeReport::BaseDesignIntf*)), + this, SLOT(slotItemSelected(LimeReport::BaseDesignIntf*))); + connect(m_reportDesignWidget, SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), + this, SLOT(slotItemPropertyChanged(QString,QString,QVariant,QVariant))); + connect(m_reportDesignWidget, SIGNAL(insertModeStarted()), this, SLOT(slotInsertModeStarted())); + + connect(m_reportDesignWidget, SIGNAL(multiItemSelected()), this, SLOT(slotMultiItemSelected())); + connect(m_reportDesignWidget, SIGNAL(itemInserted(LimeReport::PageDesignIntf*,QPointF,QString)), + this, SLOT(slotItemInserted(LimeReport::PageDesignIntf*,QPointF,QString))); + connect(m_reportDesignWidget, SIGNAL(itemInsertCanceled(QString)), this, SLOT(slotItemInsertCanceled(QString))); + connect(m_reportDesignWidget->report(),SIGNAL(datasourceCollectionLoadFinished(QString)), this, SLOT(slotUpdateDataBrowser(QString))); + connect(m_reportDesignWidget, SIGNAL(commandHistoryChanged()),this,SLOT(slotCommandHistoryChanged())); + connect(m_reportDesignWidget, SIGNAL(bandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + this, SLOT(slotBandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); + connect(m_reportDesignWidget, SIGNAL(bandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + this, SLOT(slotBandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); + connect(m_reportDesignWidget->report(), SIGNAL(renderStarted()), this, SLOT(renderStarted())); + connect(m_reportDesignWidget->report(), SIGNAL(renderPageFinished(int)), this, SLOT(renderPageFinished(int))); + connect(m_reportDesignWidget->report(), SIGNAL(renderFinished()), this, SLOT(renderFinished())); +} + +void ReportDesignWindow::createObjectInspector() +{ + m_objectInspector = new ObjectInspectorWidget(this); + m_propertyModel = new BaseDesignPropertyModel(this); + m_validator = new ObjectNameValidator(); + m_propertyModel->setValidator(m_validator); + m_propertyModel->setSubclassesAsLevel(false); +// connect(m_propertyModel,SIGNAL(objectPropetyChanged(QString,QVariant,QVariant)),this,SLOT(slotItemDataChanged(QString,QVariant,QVariant))); + m_objectInspector->setModel(m_propertyModel); + m_objectInspector->setAlternatingRowColors(true); + m_objectInspector->setRootIsDecorated(!m_propertyModel->subclassesAsLevel()); + + QDockWidget *objectDoc = new QDockWidget(this); + QWidget* w = new QWidget(objectDoc); + QVBoxLayout* l = new QVBoxLayout(w); + l->addWidget(m_objectInspector); + l->setContentsMargins(2,2,2,2); + w->setLayout(l); + objectDoc->setWindowTitle(tr("Object Inspector")); + objectDoc->setWidget(w); + objectDoc->setObjectName("objectInspector"); + addDockWidget(Qt::LeftDockWidgetArea,objectDoc); +} + +void ReportDesignWindow::createObjectsBrowser() +{ + QDockWidget *doc = new QDockWidget(this); + doc->setWindowTitle(tr("Report structure")); + m_objectsBrowser = new ObjectBrowser(doc); + doc->setWidget(m_objectsBrowser); + doc->setObjectName("structureDoc"); + addDockWidget(Qt::RightDockWidgetArea,doc); + m_objectsBrowser->setMainWindow(this); + m_objectsBrowser->setReportEditor(m_reportDesignWidget); +} + +void ReportDesignWindow::createDataWindow() +{ + QDockWidget *dataDoc = new QDockWidget(this); + dataDoc->setWindowTitle(tr("Data Browser")); + m_dataBrowser=new DataBrowser(dataDoc); + dataDoc->setWidget(m_dataBrowser); + dataDoc->setObjectName("dataDoc"); + addDockWidget(Qt::LeftDockWidgetArea,dataDoc); + m_dataBrowser->setSettings(settings()); + m_dataBrowser->setMainWindow(this); + m_dataBrowser->setReportEditor(m_reportDesignWidget); +} + +void ReportDesignWindow::updateRedoUndo() +{ + m_undoAction->setEnabled(m_reportDesignWidget->isCanUndo()); + m_redoAction->setEnabled(m_reportDesignWidget->isCanRedo()); +} + +void ReportDesignWindow::startNewReport() +{ + m_reportDesignWidget->clear(); + m_reportDesignWidget->createStartPage(); + m_lblReportName->setText(""); + updateRedoUndo(); + m_newPageHeader->setEnabled(true); + m_newPageFooter->setEnabled(true); + m_newReportHeader->setEnabled(true); + m_newReportFooter->setEnabled(true); +} + +void ReportDesignWindow::writePosition() +{ + settings()->beginGroup("DesignerWindow"); + settings()->setValue("Geometry",saveGeometry()); + settings()->setValue("State",saveState()); + settings()->endGroup(); +} + +void ReportDesignWindow::writeState() +{ + settings()->beginGroup("DesignerWindow"); + settings()->setValue("State",saveState()); + settings()->setValue("InspectorFirsColumnWidth",m_objectInspector->columnWidth(0)); + settings()->endGroup(); +} + +void ReportDesignWindow::restoreSetting() +{ + settings()->beginGroup("DesignerWindow"); + QVariant v = settings()->value("Geometry"); + if (v.isValid()){ + restoreGeometry(v.toByteArray()); + } + v = settings()->value("State"); + if (v.isValid()){ + restoreState(v.toByteArray()); + } + v = settings()->value("InspectorFirsColumnWidth"); + if (v.isValid()){ + m_objectInspector->setColumnWidth(0,v.toInt()); + } + settings()->endGroup(); +} + +bool ReportDesignWindow::checkNeedToSave() +{ + if (m_reportDesignWidget->isNeedToSave()){ + QMessageBox::StandardButton button = QMessageBox::question( + this,"",tr("Report has been modified ! Do you want save the report ?"), + QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, QMessageBox::Yes + ); + switch (button) { + case QMessageBox::Cancel: + break; + case QMessageBox::Yes: + if (!m_reportDesignWidget->save()) break; + default: + return true; + } + return false; + } + return true; +} + +void ReportDesignWindow::showModal() +{ + bool deleteOnClose = testAttribute(Qt::WA_DeleteOnClose); + setAttribute(Qt::WA_DeleteOnClose,false); + setAttribute(Qt::WA_ShowModal,true); + restoreSetting(); + show(); + m_eventLoop.exec(); + if (deleteOnClose) delete this; +} + +void ReportDesignWindow::showNonModal() +{ + restoreSetting(); + show(); +} + +void ReportDesignWindow::setSettings(QSettings* value) +{ + if (m_ownedSettings) + delete m_settings; + m_settings=value; + m_ownedSettings=false; + restoreSetting(); +} + +QSettings*ReportDesignWindow::settings() +{ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings = true; + return m_settings; + } +} + +void ReportDesignWindow::slotNewReport() +{ + if (checkNeedToSave()) startNewReport(); +} + +void ReportDesignWindow::slotNewTextItem() +{ + if (m_newTextItemAction->isChecked()) {m_newTextItemAction->setCheckable(false);return;} + if (m_reportDesignWidget) { + m_reportDesignWidget->startInsertMode("TextItem"); + m_newTextItemAction->setCheckable(true); + m_newTextItemAction->setChecked(true); + } +} + +void ReportDesignWindow::slotNewBand(const QString& bandType) +{ + if(m_reportDesignWidget) m_reportDesignWidget->addBand(bandType); +} + +void ReportDesignWindow::slotNewBand(int bandType) +{ + if(m_reportDesignWidget) m_reportDesignWidget->addBand(BandDesignIntf::BandsType(bandType)); +} + +void ReportDesignWindow::slotItemSelected(LimeReport::BaseDesignIntf *item) +{ + if (m_propertyModel->currentObject()!=item){ + + m_newSubDetail->setEnabled(false); + m_newSubDetailHeader->setEnabled(false); + m_newSubDetailFooter->setEnabled(false); + m_newGroupHeader->setEnabled(false); + m_newGroupFooter->setEnabled(false); + + m_objectInspector->commitActiveEditorData(); + m_propertyModel->setObject(item); + if (m_propertyModel->subclassesAsLevel()) + m_objectInspector->expandToDepth(0); + + QSet bs; + bs<(item); + if (band){ + if (bs.contains(band->bandType())){ + m_newSubDetail->setEnabled(true); + } + if ((band->bandType()==BandDesignIntf::Data)|| + (band->bandType()==BandDesignIntf::SubDetailBand) + ) + { + m_newGroupHeader->setEnabled(true); + } + if (band->bandType()==BandDesignIntf::GroupHeader){ + m_newGroupFooter->setEnabled(!band->isConnectedToBand(BandDesignIntf::GroupFooter)); + } + if (band->bandType()==BandDesignIntf::SubDetailBand){ + m_newSubDetailHeader->setEnabled(!band->isConnectedToBand(BandDesignIntf::SubDetailHeader)); + m_newSubDetailFooter->setEnabled(!band->isConnectedToBand(BandDesignIntf::SubDetailFooter)); + } + } + + m_fontEditorBar->setItem(item); + m_textAlignmentEditorBar->setItem(item); + m_itemsBordersEditorBar->setItem(item); + } +} + +void ReportDesignWindow::slotItemPropertyChanged(const QString &objectName, const QString &propertyName, const QVariant& oldValue, const QVariant& newValue ) +{ + Q_UNUSED(oldValue) + Q_UNUSED(newValue) + + if (m_propertyModel->currentObject()&&(m_propertyModel->currentObject()->objectName()==objectName)){ + m_propertyModel->updateProperty(propertyName); + } +} + +void ReportDesignWindow::slotMultiItemSelected() +{ + m_objectInspector->commitActiveEditorData(); + + QList selectionList; + foreach (QGraphicsItem* gi, m_reportDesignWidget->activePage()->selectedItems()) { + QObject* oi = dynamic_cast(gi); + if (oi) selectionList.append(oi); + } + m_propertyModel->setMultiObjects(&selectionList); + if (m_propertyModel->subclassesAsLevel()) + m_objectInspector->expandToDepth(0); +} + +void ReportDesignWindow::slotInsertModeStarted() +{ + m_editModeAction->setChecked(false); +} + +void ReportDesignWindow::slotItemInserted(PageDesignIntf *, QPointF, const QString &ItemType) +{ + m_editModeAction->setChecked(true); + if (m_actionMap.value(ItemType)) + m_actionMap.value(ItemType)->setCheckable(false); +} + +void ReportDesignWindow::slotItemInsertCanceled(const QString &ItemType) +{ + m_editModeAction->setChecked(true); + if (m_actionMap.value(ItemType)) + m_actionMap.value(ItemType)->setCheckable(false); +} + +void ReportDesignWindow::slotUpdateDataBrowser(const QString &collectionName) +{ + if (collectionName.compare("connections",Qt::CaseInsensitive)==0){ + if (m_dataBrowser) m_dataBrowser->initConnections(); + } + if (collectionName.compare("queries",Qt::CaseInsensitive)==0){ + if (m_dataBrowser) m_dataBrowser->updateDataTree(); + } + if (collectionName.compare("subqueries",Qt::CaseInsensitive)==0){ + if (m_dataBrowser) m_dataBrowser->updateDataTree(); + } + if (collectionName.compare("subproxies",Qt::CaseInsensitive)==0){ + if (m_dataBrowser) m_dataBrowser->updateDataTree(); + } + if (collectionName.compare("variables",Qt::CaseInsensitive)==0){ + if (m_dataBrowser) m_dataBrowser->updateVariablesTree(); + } +} + +void ReportDesignWindow::slotCommandHistoryChanged() +{ + updateRedoUndo(); +} + +void ReportDesignWindow::slotSaveReport() +{ + m_reportDesignWidget->save(); + m_lblReportName->setText(m_reportDesignWidget->reportFileName()); +} + +void ReportDesignWindow::slotSaveReportAs() +{ + QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name"),"","Report files(*.lrxml);; All files(*)"); + if (!fileName.isEmpty()){ + m_reportDesignWidget->saveToFile(fileName); + m_lblReportName->setText(m_reportDesignWidget->reportFileName()); + } +} + +void ReportDesignWindow::slotLoadReport() +{ + if (checkNeedToSave()){ + QString fileName = QFileDialog::getOpenFileName(this,tr("Report file name"),"","Report files(*.lrxml);; All files(*)"); + if (!fileName.isEmpty()) { + QApplication::processEvents(); + setCursor(Qt::WaitCursor); + m_reportDesignWidget->clear(); + m_reportDesignWidget->loadFromFile(fileName); + m_lblReportName->setText(fileName); + m_propertyModel->setObject(0); + updateRedoUndo(); + unsetCursor(); + } + } +} + +void ReportDesignWindow::slotZoomIn() +{ + m_reportDesignWidget->scale(1.2,1.2); +} + +void ReportDesignWindow::slotZoomOut() +{ + m_reportDesignWidget->scale(1/1.2,1/1.2); +} + +void ReportDesignWindow::slotEditMode() +{ + m_editModeAction->setChecked(true); + m_reportDesignWidget->startEditMode(); +} + +void ReportDesignWindow::slotUndo() +{ + m_reportDesignWidget->undo(); + updateRedoUndo(); + +} + +void ReportDesignWindow::slotRedo() +{ + m_reportDesignWidget->redo(); + updateRedoUndo(); +} + +void ReportDesignWindow::slotCopy() +{ + m_reportDesignWidget->copy(); +} + +void ReportDesignWindow::slotPaste() +{ + m_reportDesignWidget->paste(); +} + +void ReportDesignWindow::slotCut() +{ + m_reportDesignWidget->cut(); +} + +void ReportDesignWindow::slotDelete() +{ + m_reportDesignWidget->deleteSelectedItems(); +} + +void ReportDesignWindow::slotEditLayoutMode() +{ + m_reportDesignWidget->editLayoutMode(m_editLayoutMode->isChecked()); +} + +void ReportDesignWindow::slotHLayout() +{ + m_reportDesignWidget->addHLayout(); +} + +void ReportDesignWindow::slotTest() +{ +} + +void ReportDesignWindow::slotPrintReport() +{ + setCursor(Qt::WaitCursor); + m_reportDesignWidget->report()->printReport(); + setCursor(Qt::ArrowCursor); +} + +void ReportDesignWindow::slotPreviewReport() +{ + m_reportDesignWidget->report()->previewReport(); +} + +void ReportDesignWindow::slotItemActionCliked() +{ + QAction* action=dynamic_cast(sender()); + action->setCheckable(true); + action->setChecked(true); + m_reportDesignWidget->startInsertMode(action->whatsThis()); +} + +void ReportDesignWindow::slotBandAdded(PageDesignIntf *, BandDesignIntf * band) +{ + if (band->isUnique()){ + switch (band->bandType()) { + case BandDesignIntf::PageHeader: + m_newPageHeader->setDisabled(true); + break; + case BandDesignIntf::PageFooter: + m_newPageFooter->setDisabled(true); + break; + case BandDesignIntf::ReportHeader: + m_newReportHeader->setDisabled(true); + break; + case BandDesignIntf::ReportFooter: + m_newReportFooter->setDisabled(true); + default: + break; + } + } +} + +void ReportDesignWindow::slotBandDeleted(PageDesignIntf *, BandDesignIntf *band) +{ + if (band->isUnique()){ + switch (band->bandType()) { + case BandDesignIntf::PageHeader: + m_newPageHeader->setEnabled(true); + break; + case BandDesignIntf::PageFooter: + m_newPageFooter->setEnabled(true); + break; + case BandDesignIntf::ReportHeader: + m_newReportHeader->setEnabled(true); + break; + case BandDesignIntf::ReportFooter: + m_newReportFooter->setEnabled(true); + default: + break; + } + } +} + +void ReportDesignWindow::renderStarted() +{ + if (m_showProgressDialog){ + m_progressDialog = new QProgressDialog(tr("Rendering report"),tr("Abort"),0,0,this); + m_progressDialog->open(m_reportDesignWidget->report(),SLOT(cancelRender())); + QApplication::processEvents(); + } +} + +void ReportDesignWindow::renderPageFinished(int renderedPageCount) +{ + if (m_progressDialog) + m_progressDialog->setLabelText(QString::number(renderedPageCount)+tr(" page rendered")); +} + +void ReportDesignWindow::renderFinished() +{ + if (m_progressDialog){ + m_progressDialog->close(); + delete m_progressDialog; + } + m_progressDialog = 0; +} + +void ReportDesignWindow::slotShowAbout() +{ + AboutDialog* about = new AboutDialog(this); + about->exec(); +} + +void ReportDesignWindow::closeEvent(QCloseEvent * event) +{ + if (checkNeedToSave()){ + m_dataBrowser->closeAllDataWindows(); + writeState(); +#ifdef Q_OS_WIN + writePosition(); +#endif +#ifdef Q_OS_MAC + writePosition(); +#endif + m_eventLoop.exit(); + event->accept(); + } else event->ignore(); +} + +void ReportDesignWindow::resizeEvent(QResizeEvent*) +{ +#ifdef Q_OS_UNIX + writePosition(); +#endif +} + +void ReportDesignWindow::moveEvent(QMoveEvent*) +{ +#ifdef Q_OS_UNIX + writePosition(); +#endif +} + +bool ObjectNameValidator::validate(const QString &propName, const QVariant &propValue, QObject *object, QString &msg) +{ + if (propName.compare("objectName")==0){ + BaseDesignIntf* bd = dynamic_cast(object); + if (bd){ + if (bd->page()->reportItemByName(propValue.toString())){ + msg = QString(QObject::tr("Object with name %1 already exists").arg(propValue.toString())); + return false; + } else (bd->emitObjectNamePropertyChanged(object->objectName(),propValue.toString())); + } + } + return true; +} + +} + diff --git a/src/lrreportdesignwindow.h b/src/lrreportdesignwindow.h new file mode 100644 index 0000000..2c0c490 --- /dev/null +++ b/src/lrreportdesignwindow.h @@ -0,0 +1,213 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTEDITORWINDOW_H +#define LRREPORTEDITORWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include "lrbanddesignintf.h" +#include "items/editors/lrfonteditorwidget.h" +#include "items/editors/lrtextalignmenteditorwidget.h" +#include "items/editors/lritemsaligneditorwidget.h" +#include "items/editors/lritemsborderseditorwidget.h" +#include "lrobjectitemmodel.h" + +namespace LimeReport{ + +class ObjectInspectorWidget; +class QObjectPropertyModel; +class ReportDesignWidget; +class DataBrowser; +class BaseDesignIntf; +class PageDesignIntf; +class ObjectBrowser; + +class ReportDesignWindow : public QMainWindow +{ + Q_OBJECT +public: + explicit ReportDesignWindow(ReportEnginePrivate* report, QWidget *parent = 0, QSettings* settings=0); + ~ReportDesignWindow(); + static ReportDesignWindow* instance(){return m_instance;} + + bool checkNeedToSave(); + void showModal(); + void showNonModal(); + void setSettings(QSettings* value); + QSettings* settings(); + void restoreSetting(); + void setShowProgressDialog(bool value){m_showProgressDialog = value;} + +private slots: + void slotNewReport(); + void slotNewTextItem(); + void slotNewBand(const QString& bandType); + void slotNewBand(int bandType); + void slotSaveReport(); + void slotSaveReportAs(); + void slotLoadReport(); + void slotZoomIn(); + void slotZoomOut(); + void slotEditMode(); + void slotUndo(); + void slotRedo(); + void slotCopy(); + void slotPaste(); + void slotCut(); + void slotDelete(); + void slotEditLayoutMode(); + void slotHLayout(); + void slotItemSelected(LimeReport::BaseDesignIntf *item); + void slotItemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant &oldValue, const QVariant &newValue); + void slotMultiItemSelected(); + void slotInsertModeStarted(); + void slotItemInserted(LimeReport::PageDesignIntf* , QPointF, const QString& ItemType); + void slotItemInsertCanceled(const QString& ItemType); + void slotUpdateDataBrowser(const QString& collectionName); + void slotCommandHistoryChanged(); + void slotTest(); + void slotPrintReport(); + void slotPreviewReport(); + void slotItemActionCliked(); + void slotBandAdded(LimeReport::PageDesignIntf*, LimeReport::BandDesignIntf*band); + void slotBandDeleted(LimeReport::PageDesignIntf*, LimeReport::BandDesignIntf*band); + void renderStarted(); + void renderPageFinished(int renderedPageCount); + void renderFinished(); + void slotShowAbout(); +protected: + void closeEvent(QCloseEvent *event); + void resizeEvent(QResizeEvent *); + void moveEvent(QMoveEvent *); +private: + void createActions(); + void createBandsButton(); + void createMainMenu(); + void createToolBars(); + void createReportToolBar(); + void createItemsActions(); + void createObjectInspector(); + void createObjectsBrowser(); + void initReportEditor(ReportEnginePrivate* report); + void createDataWindow(); + void updateRedoUndo(); + void startNewReport(); + void writePosition(); + void writeState(); + +private: + static ReportDesignWindow* m_instance; + + QStatusBar* m_statusBar; + QToolBar* m_mainToolBar; + QToolBar* m_fontToolBar; + QToolBar* m_reportToolBar; + QToolBar* m_alignToolBar; + QToolButton* m_newBandButton; + QMenuBar* m_mainMenu; + QMenu* m_fileMenu; + QMenu* m_editMenu; + QMenu* m_infoMenu; + + QAction* m_newReportAction; + QAction* m_newTextItemAction; + QAction* m_deleteItemAction; + QAction* m_saveReportAction; + QAction* m_saveReportAsAction; + QAction* m_loadReportAction; + QAction* m_zoomInReportAction; + QAction* m_zoomOutReportAction; + QAction* m_previewReportAction; + QAction* m_closeRenderViewAction; + QAction* m_nextPageAction; + QAction* m_priorPageAction; + QAction* m_testAction; + QAction* m_printReportAction; + QAction* m_editModeAction; + QAction* m_undoAction; + QAction* m_redoAction; + QAction* m_copyAction; + QAction* m_pasteAction; + QAction* m_cutAction; + + QAction* m_newPageHeader; + QAction* m_newPageFooter; + QAction* m_newReportHeader; + QAction* m_newReportFooter; + QAction* m_newData; + QAction* m_newSubDetail; + QAction* m_newSubDetailHeader; + QAction* m_newSubDetailFooter; + QAction* m_newGroupHeader; + QAction* m_newGroupFooter; + QAction* m_aboutAction; + QAction* m_editLayoutMode; + QAction* m_addHLayout; + + QSignalMapper* m_bandsAddSignalsMap; + + ObjectInspectorWidget* m_objectInspector; + QObjectPropertyModel* m_propertyModel; + + ReportDesignWidget* m_reportDesignWidget; + DataBrowser * m_dataBrowser; + + ObjectBrowser* m_objectsBrowser; + + QHash m_actionMap; + QLabel* m_lblReportName; + QEventLoop m_eventLoop; + QFontComboBox* m_fontNameEditor; + QComboBox* m_fontSizeEditor; + QStringListModel m_fontSizeModel; + bool m_textAttibutesIsChanging; + BaseDesignIntf const * m_fontItem; + FontEditorWidget* m_fontEditorBar; + TextAlignmentEditorWidget* m_textAlignmentEditorBar; + ItemsAlignmentEditorWidget* m_itemsAlignmentEditorBar; + ItemsBordersEditorWidget* m_itemsBordersEditorBar; + QSettings* m_settings; + bool m_ownedSettings; + ValidatorIntf* m_validator; + QProgressDialog* m_progressDialog; + bool m_showProgressDialog; +}; + +class ObjectNameValidator : public ValidatorIntf{ + bool validate(const QString &propName, const QVariant &propValue, QObject *object, QString &msg); +}; + +} +#endif // LRREPORTEDITORWINDOW_H diff --git a/src/lrreportengine.cpp b/src/lrreportengine.cpp new file mode 100644 index 0000000..728b498 --- /dev/null +++ b/src/lrreportengine.cpp @@ -0,0 +1,587 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include +#include +#include + +#include "time.h" + +#include "lrreportengine_p.h" +#include "lrreportengine.h" + +#include "lrpagedesignintf.h" +#include "lrdatasourcemanager.h" +#include "lrdatabrowser.h" +#include "lrreportdesignwindow.h" + +#include "serializators/lrxmlwriter.h" +#include "serializators/lrxmlreader.h" +#include "lrreportrender.h" +#include "lrpreviewreportwindow.h" + +namespace LimeReport{ + +QSettings* ReportEngine::m_settings = 0; + +ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : + QObject(parent), m_fileName(""), m_settings(0), m_ownedSettings(false), + m_printer(new QPrinter(QPrinter::HighResolution)), m_printerSelected(false), m_showProgressDialog(true) +{ + m_datasources= new DataSourceManager(this); + m_datasources->setObjectName("datasources"); + //m_reportRender=ReportRender::Ptr(new ReportRender()); + //m_reportRender->setDatasources(m_datasources); + connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); +} + +ReportEnginePrivate::~ReportEnginePrivate() +{ + foreach(PageDesignIntf* page,m_pages) delete page; + m_pages.clear(); + if (m_ownedSettings&&m_settings) delete m_settings; +} + +QObject* ReportEnginePrivate::createElement(const QString &, const QString &) +{ + return appendPage(); +} + +QObject *ReportEnginePrivate::elementAt(const QString &, int index) +{ + return pageAt(index); +} + +PageDesignIntf *ReportEnginePrivate::createPage(const QString &pageName) +{ + PageDesignIntf* page =new PageDesignIntf(this); + page->setObjectName(pageName); + page->setReportEditor(this); + //m_pages.append(page); + return page; +} + +PageDesignIntf *ReportEnginePrivate::appendPage(const QString &pageName) +{ + PageDesignIntf* page = createPage(pageName); + m_pages.append(page); + return page; +} + +PageDesignIntf *ReportEnginePrivate::createPreviewPage() +{ + return createPage(); +} + +int ReportEnginePrivate::elementsCount(const QString &) +{ + return m_pages.count(); +} + +void ReportEnginePrivate::collectionLoadFinished(const QString &) +{ + foreach (PageDesignIntf* page, m_pages) { + page->setReportEditor(this); + page->setSceneRect(-SCENE_MARGIN,-SCENE_MARGIN, + page->pageItem()->width()+SCENE_MARGIN*2, + page->pageItem()->height()+SCENE_MARGIN*2); + } + emit pagesLoadFinished(); +} + +void ReportEnginePrivate::saveError(QString message) +{ + m_lastError = message; +} + +void ReportEnginePrivate::showError(QString message) +{ + QMessageBox::critical(0,tr("Error"),message); +} + +void ReportEnginePrivate::slotDataSourceCollectionLoaded(const QString &collectionName) +{ + emit datasourceCollectionLoadFinished(collectionName); +} + +void ReportEnginePrivate::clearReport() +{ + foreach(PageDesignIntf* page,m_pages) delete page; + m_pages.clear(); + m_datasources->clear(DataSourceManager::Owned); + m_fileName=""; + emit cleared(); +} + +void ReportEnginePrivate::printReport(ItemsReaderIntf::Ptr reader, QPrinter& printer) +{ + LimeReport::PageDesignIntf renderPage; + renderPage.setItemMode(PrintMode); + if (reader->first()){ + reader->readItem(renderPage.pageItem()); + printer.setPageMargins(renderPage.pageItem()->leftMargin(), + renderPage.pageItem()->topMargin(), + renderPage.pageItem()->rightMargin(), + renderPage.pageItem()->bottomMargin(), + QPrinter::Millimeter); + printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); + renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + + QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? + QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): + renderPage.pageItem()->sizeMM(); + printer.setPaperSize(pageSize,QPrinter::Millimeter); + + QPainter painter(&printer); + renderPage.render(&painter); + + while (reader->next()){ + printer.newPage(); + renderPage.removeAllItems(); + reader->readItem(renderPage.pageItem()); + renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + renderPage.render(&painter); + } + } +} + +void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer, const PrintRange& printRange) +{ + LimeReport::PageDesignIntf renderPage; + renderPage.setItemMode(PrintMode); + QPainter* painter=0; + + bool isFirst = true; + int currenPage = 1; + foreach(PageItemDesignIntf::Ptr page,pages){ + + if ( + (printRange.rangeType()==QPrintDialog::AllPages) || + ( (printRange.rangeType()==QPrintDialog::PageRange) && + (currenPage>=printRange.fromPage()) && + (currenPage<=printRange.toPage()) + ) + ) + { + + QPointF pagePos = page->pos(); + page->setPos(0,0); + renderPage.setPageItem(page); + + renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + printer.setPageMargins(renderPage.pageItem()->leftMargin(), + renderPage.pageItem()->topMargin(), + renderPage.pageItem()->rightMargin(), + renderPage.pageItem()->bottomMargin(), + QPrinter::Millimeter); + printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); + + QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? + QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): + renderPage.pageItem()->sizeMM(); + printer.setPaperSize(pageSize,QPrinter::Millimeter); + + if (!isFirst){ + printer.newPage(); + } else { + isFirst=false; + painter = new QPainter(&printer); + } + + renderPage.render(painter); + page->setPos(pagePos); + } + + currenPage++; + } + if (painter) delete painter; + +} + +bool ReportEnginePrivate::printReport(QPrinter* printer) +{ + //QScopedPointerl_printer(new QPrinter(QPrinter::HighResolution)); + if (!printer&&!m_printerSelected){ + QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); + m_printerSelected = dialog.exec()!=QDialog::Rejected; + } + if (!printer&&!m_printerSelected) return false; + + printer =(printer)?printer:m_printer.data(); + if (printer&&printer->isValid()){ + try{ + dataManager()->setDesignTime(false); + printReport(renderToPages(),*printer,PrintRange()); + dataManager()->setDesignTime(true); + } catch(ReportError &exception){ + saveError(exception.what()); + } + return true; + } else return false; +} + +void ReportEnginePrivate::printToFile(const QString &fileName) +{ + if (!fileName.isEmpty()){ + QFile file(fileName); + if (file.open(QIODevice::WriteOnly)){ + QTextStream out(&file); + try { + dataManager()->setDesignTime(false); + out<setDesignTime(true); + } catch( ReportError &exception){ + saveError(exception.what()); + } + } + file.close(); + } +} + +void ReportEnginePrivate::previewReport() +{ + QTime start = QTime::currentTime(); + try{ + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(true); + if (pages.count()>0){ + PreviewReportWindow* w = new PreviewReportWindow(this,QApplication::activeWindow(),settings()); + w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint); + w->setAttribute(Qt::WA_DeleteOnClose,true); + w->setWindowModality(Qt::ApplicationModal); + w->setWindowIcon(QIcon(":/report/images/main.ico")); + w->setSettings(settings()); + w->setPages(pages); + if (!dataManager()->errorsList().isEmpty()){ + w->setErrorMessages(dataManager()->errorsList()); + } + qDebug()<<"render time ="<exec(); + } + } catch (ReportError &exception){ + saveError(exception.what()); + showError(exception.what()); + } +} + +PageDesignIntf* ReportEnginePrivate::createPreviewScene(QObject* parent){ + PageDesignIntf* result = 0; + try { + ReportPages pages = renderToPages(); + result = new PageDesignIntf(parent); + result->setPageItems(pages); + } catch (ReportError &exception){ + saveError(exception.what()); + showError(exception.what()); + } + return result; +} + +void ReportEnginePrivate::cancelRender() +{ + if (m_reportRender) + m_reportRender->cancelRender(); +} + +//PageDesignIntf* ReportEngine::createPreviewScene(QObject* parent){ +// Q_D(ReportEngine); +// return d->createPreviewScene(parent); +//} + +void ReportEnginePrivate::designReport() +{ + LimeReport::ReportDesignWindow* w = new LimeReport::ReportDesignWindow(this,QApplication::activeWindow(),settings()); + w->setAttribute(Qt::WA_DeleteOnClose,true); + w->setWindowIcon(QIcon(":report/images/main")); + w->setShowProgressDialog(m_showProgressDialog); +#if defined(Q_OS_MAC) + //w->showModal(); +#elif defined(Q_OS_UNIX) + //w->showModal(); +#endif +#ifdef Q_OS_WIN + w->setWindowFlags(Qt::Window|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint); + w->setWindowModality(Qt::ApplicationModal); + //w->showModal(); +#endif + if (QApplication::activeWindow()==0){ + w->show(); + } else { + w->showModal(); + } +} + +void ReportEnginePrivate::setSettings(QSettings* value) +{ + if (value){ + if (m_ownedSettings&&m_settings) + delete m_settings; + m_settings = value; + m_ownedSettings = false; + } +} + +QSettings*ReportEnginePrivate::settings() +{ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings=true; + return m_settings; + } +} + +bool ReportEnginePrivate::loadFromFile(const QString &fileName) +{ + clearReport(); + //QScopedPointer< ItemsReaderIntf > reader(new FileXMLReader(fileName)); + ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName); + if (reader->first()){ + if (reader->readItem(this)){ + m_fileName=fileName; + return true; + }; + } + return false; +} + +bool ReportEnginePrivate::loadFromByteArray(QByteArray* data){ + clearReport(); + ItemsReaderIntf::Ptr reader = ByteArrayXMLReader::create(data); + if (reader->first()){ + if (reader->readItem(this)){ + m_fileName=""; + return true; + }; + } + return false; +} + +bool ReportEnginePrivate::saveToFile(const QString &fileName) +{ + if (fileName.isEmpty()) return false; + QFileInfo fi(fileName); + QString fn = fileName; + if (fi.suffix().isEmpty()) + fn+=".lrxml"; + + QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + writer->putItem(this); + m_fileName=fn; + bool saved = writer->saveToFile(fn); + if (saved){ + foreach(PageDesignIntf* page, m_pages){ + page->setToSaved(); + } + } + return saved; +} + +bool ReportEnginePrivate::isNeedToSave() +{ + foreach(PageDesignIntf* page, m_pages){ + if (page->isHasChanges()) return true; + } + return false; +} + +bool ReportEnginePrivate::saveToFile() +{ + if (m_fileName.isEmpty()) return false; + return saveToFile(m_fileName); +} + +QString ReportEnginePrivate::renderToString() +{ + LimeReport::ReportRender render; + dataManager()->connectAllDatabases(); + dataManager()->setDesignTime(false); + if (m_pages.count()){ + render.setDatasources(dataManager()); + return render.renderPageToString(m_pages.at(0)); + }else return QString(); +} + +ReportPages ReportEnginePrivate::renderToPages() +{ + + //ReportRender render; + m_reportRender = ReportRender::Ptr(new ReportRender); + dataManager()->clearErrorsList(); + dataManager()->connectAllDatabases(); + dataManager()->setDesignTime(false); + connect(m_reportRender.data(),SIGNAL(pageRendered(int)), + this, SIGNAL(renderPageFinished(int))); + if (m_pages.count()){ + emit renderStarted(); + m_reportRender->setDatasources(dataManager()); + ReportPages result = m_reportRender->renderPageToPages(m_pages.at(0)); + emit renderFinished(); + return result; + }else return ReportPages(); + m_reportRender.clear(); +} + +QString ReportEnginePrivate::lastError() +{ + return m_lastError; +} + +ReportEngine::ReportEngine(QObject *parent) + : QObject(parent), d_ptr(new ReportEnginePrivate()) +{ + Q_D(ReportEngine); + d->q_ptr=this; + connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted())); + connect(d, SIGNAL(renderPageFinished(int)), + this, SIGNAL(renderPageFinished(int))); + connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); +} + +ReportEngine::~ReportEngine() +{ + if (d_ptr) delete d_ptr; +} + +bool ReportEngine::printReport(QPrinter *printer) +{ + Q_D(ReportEngine); + return d->printReport(printer); +} + +//void ReportEngine::printReport(ReportPages pages, QPrinter &printer){ +// Q_D(ReportEngine); +// d->printReport(pages,printer,PrintRange()); +//} + +void ReportEngine::printToFile(const QString &fileName) +{ + Q_D(ReportEngine); + d->printToFile(fileName); +} + +void ReportEngine::previewReport() +{ + Q_D(ReportEngine); + if (m_settings) + d->setSettings(m_settings); + d->previewReport(); +} + +void ReportEngine::designReport() +{ + Q_D(ReportEngine); + if (m_settings) + d->setSettings(m_settings); + d->designReport(); +} + +void ReportEngine::setShowProgressDialog(bool value) +{ + Q_D(ReportEngine); + d->setShowProgressDialog(value); +} + +IDataSourceManager *ReportEngine::dataManager() +{ + Q_D(ReportEngine); + return d->dataManagerIntf(); +} + +IScriptEngineManager* ReportEngine::scriptManager() +{ + Q_D(ReportEngine); + return d->scriptManagerIntf(); +} + +bool ReportEngine::loadFromFile(const QString &fileName) +{ + Q_D(ReportEngine); + return d->loadFromFile(fileName); +} + +bool ReportEngine::loadFromByteArray(QByteArray* data){ + Q_D(ReportEngine); + return d->loadFromByteArray(data); +} + +QString ReportEngine::reportFileName() +{ + Q_D(ReportEngine); + return d->reportFileName(); +} + +//void ReportDesignIntf::setPrinter(QPrinter *printer) +//{ +// Q_D(ReportDesignIntf); +// d->setPrinter(printer); +//} + +bool ReportEngine::saveToFile() +{ + Q_D(ReportEngine); + return d->saveToFile(); +} + +bool ReportEngine::saveToFile(const QString &fileName) +{ + Q_D(ReportEngine); + return d->saveToFile(fileName); +} + +QString ReportEngine::lastError() +{ + Q_D(ReportEngine); + return d->lastError(); +} + +void ReportEngine::cancelRender() +{ + Q_D(ReportEngine); + d->cancelRender(); +} + +ReportEngine::ReportEngine(ReportEnginePrivate &dd, QObject *parent) + :QObject(parent),d_ptr(&dd) +{ + Q_D(ReportEngine); + d->q_ptr=this; + connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted())); + connect(d, SIGNAL(renderPageFinished(int)), + this, SIGNAL(renderPageFinished(int))); + connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); +} + + + +} diff --git a/src/lrreportengine.h b/src/lrreportengine.h new file mode 100644 index 0000000..924976a --- /dev/null +++ b/src/lrreportengine.h @@ -0,0 +1,105 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTDESIGNINTF_H +#define LRREPORTDESIGNINTF_H + +#include +#include +#include + +#include "lrglobal.h" +#include "lrdatasourcemanagerintf.h" +#include "lrscriptenginemanagerintf.h" +//#include "lrreportrender.h" + +class QPrinter; + +namespace LimeReport { + + +class PrintRange{ +public: + int fromPage() const { return m_fromPage;} + int toPage() const { return m_toPage;} + QPrintDialog::PrintRange rangeType() const { return m_rangeType;} + PrintRange(QAbstractPrintDialog::PrintRange rangeType=QPrintDialog::AllPages, int fromPage=0, int toPage=0); + void setRangeType(QAbstractPrintDialog::PrintRange rangeType){ m_rangeType=rangeType;} + void setFromPage(int fromPage){ m_fromPage = fromPage;} + void setToPage(int toPage){ m_toPage = toPage;} +private: + QPrintDialog::PrintRange m_rangeType; + int m_fromPage; + int m_toPage; +}; + +class DataSourceManager; +class ReportEnginePrivate; +//class PageDesignIntf; + +class LIMEREPORT_EXPORT ReportEngine : public QObject{ + Q_OBJECT +public: + static void setSettings(QSettings *value){m_settings=value;} +public: + explicit ReportEngine(QObject *parent = 0); + ~ReportEngine(); + bool printReport(QPrinter *printer=0); + //void printReport(ReportPages pages, QPrinter &printer); + void printToFile(const QString& fileName); + //PageDesignIntf *createPreviewScene(QObject *parent = 0); + void previewReport(); + void designReport(); + void setShowProgressDialog(bool value); + IDataSourceManager* dataManager(); + IScriptEngineManager* scriptManager(); + + bool loadFromFile(const QString& fileName); + bool loadFromByteArray(QByteArray *data); + QString reportFileName(); + bool saveToFile(); + bool saveToFile(const QString& fileName); + QString lastError(); +signals: + void renderStarted(); + void renderFinished(); + void renderPageFinished(int renderedPageCount); +public slots: + void cancelRender(); +protected: + ReportEnginePrivate * const d_ptr; + ReportEngine(ReportEnginePrivate &dd, QObject * parent=0); +private: + Q_DECLARE_PRIVATE(ReportEngine) + static QSettings* m_settings; +}; + +} // namespace LimeReport + +#endif // LRREPORTDESIGNINTF_H diff --git a/src/lrreportengine_p.h b/src/lrreportengine_p.h new file mode 100644 index 0000000..6e67427 --- /dev/null +++ b/src/lrreportengine_p.h @@ -0,0 +1,126 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTDESIGNINTF_P_H +#define LRREPORTDESIGNINTF_P_H + +#include +#include +#include "lrreportengine.h" +#include "lrcollection.h" +#include "lrglobal.h" +#include "lrdatasourcemanager.h" +#include "lrbanddesignintf.h" +#include "lrreportrender.h" +#include "serializators/lrstorageintf.h" +#include "lrscriptenginemanager.h" + +namespace LimeReport{ + +class PageDesignIntf; +class PrintRange; + +//TODO: Add on render callback + +class ReportEnginePrivate : public QObject, public ICollectionContainer +{ + Q_OBJECT + Q_DECLARE_PUBLIC(ReportEngine) + Q_PROPERTY(ACollectionProperty pages READ fakeCollectionReader()) + Q_PROPERTY(QObject* datasourcesManager READ dataManager()) +public: + static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); + static void printReport(ReportPages pages, QPrinter &printer, const PrintRange &printRange); +public: + explicit ReportEnginePrivate(QObject *parent = 0); + virtual ~ReportEnginePrivate(); + PageDesignIntf* appendPage(const QString &pageName = ""); + PageDesignIntf* createPreviewPage(); + PageDesignIntf* pageAt(int index){return (index<=(m_pages.count()-1)) ? m_pages.at(index):0;} + int pageCount() {return m_pages.count();} + DataSourceManager* dataManager(){return m_datasources;} + IDataSourceManager* dataManagerIntf(){return m_datasources;} + IScriptEngineManager* scriptManagerIntf(){return &ScriptEngineManager::instance();} + + void clearReport(); + bool printReport(QPrinter *printer=0); + void printToFile(const QString& fileName); + void previewReport(); + void designReport(); + void setSettings(QSettings* value); + void setShowProgressDialog(bool value){m_showProgressDialog = value;} + QSettings* settings(); + bool loadFromFile(const QString& fileName); + bool loadFromByteArray(QByteArray *data); + QString reportFileName(){return m_fileName;} + bool saveToFile(); + bool saveToFile(const QString& fileName); + bool isNeedToSave(); + QString lastError(); + ReportEngine * q_ptr; + PageDesignIntf *createPreviewScene(QObject *parent); +signals: + void pagesLoadFinished(); + void datasourceCollectionLoadFinished(const QString& collectionName); + void cleared(); + void renderStarted(); + void renderFinished(); + void renderPageFinished(int renderedPageCount); +public slots: + void cancelRender(); +protected: + PageDesignIntf* createPage(const QString& pageName=""); +protected slots: + void slotDataSourceCollectionLoaded(const QString& collectionName); +private: + //ICollectionContainer + virtual QObject* createElement(const QString&,const QString&); + virtual int elementsCount(const QString&); + virtual QObject* elementAt(const QString&, int index); + virtual void collectionLoadFinished(const QString&); + void saveError(QString message); + void showError(QString message); + //ICollectionContainer + ReportPages renderToPages(); + QString renderToString(); +private: + QList m_pages; + DataSourceManager* m_datasources; + ReportRender::Ptr m_reportRender; + QString m_fileName; + QString m_lastError; + QSettings* m_settings; + bool m_ownedSettings; + QScopedPointer m_printer; + bool m_printerSelected; + bool m_showProgressDialog; +}; + +} +#endif // LRREPORTDESIGNINTF_P_H diff --git a/src/lrreportrender.cpp b/src/lrreportrender.cpp new file mode 100644 index 0000000..b79a6a4 --- /dev/null +++ b/src/lrreportrender.cpp @@ -0,0 +1,680 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include + +#include "lrreportrender.h" +#include "lrpagedesignintf.h" +#include "lrbanddesignintf.h" +#include "lritemdesignintf.h" +#include "lrscriptenginemanager.h" + +#include "serializators/lrxmlreader.h" +#include "serializators/lrxmlwriter.h" + +namespace LimeReport{ + +ReportRender::ReportRender(QObject *parent) + :QObject(parent), m_renderPageItem(0), m_pageCount(0) +{} + +void ReportRender::setDatasources(DataSourceManager *value) +{ + m_datasources=value; +} + +void ReportRender::renderPage(PageDesignIntf* patternPage) +{ + m_patternPageItem=patternPage->pageItem(); + m_pageCount=1; + m_renderCanceled = false; + BandDesignIntf* reportFooter = m_patternPageItem->bandByType(BandDesignIntf::ReportFooter); + if (reportFooter) + m_reportFooterHeight = reportFooter->height(); + + initVariables(); + initGroupFunctions(); + + clearPageMap(); + + try{ + datasources()->setAllDatasourcesToFirst(); + } catch(ReportError &exception){ + //TODO posible should thow exeption + QMessageBox::critical(0,tr("Error"),exception.what()); + return; + } + + startNewPage(); + + renderBand(m_patternPageItem->bandByType(BandDesignIntf::ReportHeader),StartNewPage); + + BandDesignIntf* lastRenderedBand = 0; + for (int i=0;idataBandCount() && !m_renderCanceled;i++){ + lastRenderedBand = m_patternPageItem->dataBandAt(i); + renderDataBand(lastRenderedBand); + if (idataBandCount()-1) closeFooterGroup(lastRenderedBand); + } + + if (reportFooter) + renderBand(reportFooter,StartNewPage); + if (lastRenderedBand && lastRenderedBand->keepFooterTogether()) + closeFooterGroup(lastRenderedBand); + + savePage(); + if (!m_renderCanceled) + secondRenderPass(); +} + +int ReportRender::pageCount() +{ + return m_renderedPages.count(); +} + +PageItemDesignIntf::Ptr ReportRender::pageAt(int index) +{ + if ((index>m_renderedPages.count()-1)||(index<0)) throw ReportError("page index out of range"); + else return m_renderedPages.at(index); +} + +QString ReportRender::renderPageToString(PageDesignIntf *patternPage) +{ + renderPage(patternPage); + return toString(); +} + +ReportPages ReportRender::renderPageToPages(PageDesignIntf *patternPage) +{ + renderPage(patternPage); + return m_renderedPages; +} + +void ReportRender::initRenderPage() +{ + if (!m_renderPageItem) { + m_renderPageItem = new PageItemDesignIntf(m_patternPageItem->pageSize(), m_patternPageItem->pageRect()); + m_renderPageItem->initFromItem(m_patternPageItem); + } +} + +void ReportRender::initVariables() +{ + m_datasources->setReportVariable("#PAGE",1); + m_datasources->setReportVariable("#PAGE_COUNT",0); +} + +void ReportRender::clearPageMap() +{ + m_renderedPages.clear(); +} + +void ReportRender::extractGroupsFunction(BandDesignIntf *band) +{ + foreach(BaseDesignIntf* item,band->childBaseItems()){ + ContentItemDesignIntf* contentItem = dynamic_cast(item); + if (contentItem&&(contentItem->content().contains(QRegExp("\\$S\\s*\\{.*\\}")))){ + foreach(QString functionName, DataSourceManager::instance()->groupFunctionNames()){ + QRegExp rx(QString(GROUP_FUNCTION_RX).arg(functionName)); + QRegExp rxName(QString(GROUP_FUNCTION_NAME_RX).arg(functionName)); + if (rx.indexIn(contentItem->content())>=0){ + BandDesignIntf* dataBand = m_patternPageItem->bandByName(rx.cap(DATASOURCE_INDEX)); + if (dataBand){ + GroupFunction* gf = datasources()->addGroupFunction(functionName,rx.cap(VALUE_INDEX),band->objectName(),dataBand->objectName()); + if (gf){ + connect(dataBand,SIGNAL(bandRendered(BandDesignIntf*)),gf,SLOT(slotBandRendered(BandDesignIntf*))); + } + } else { + GroupFunction* gf = datasources()->addGroupFunction(functionName,rx.cap(VALUE_INDEX),band->objectName(),rx.cap(DATASOURCE_INDEX)); + gf->setInvalid(tr("Databand \"%1\" not found").arg(rx.cap(DATASOURCE_INDEX))); + } + } else if (rxName.indexIn(contentItem->content())>=0){ + GroupFunction* gf = datasources()->addGroupFunction(functionName,rxName.cap(1),band->objectName(),""); + gf->setInvalid(tr("Wrong using function %1").arg(functionName)); + } + } + } + } +} + +void ReportRender::replaceGroupsFunction(BandDesignIntf *band) +{ + foreach(BaseDesignIntf* item,band->childBaseItems()){ + ContentItemDesignIntf* contentItem = dynamic_cast(item); + if (contentItem){ + QString content = contentItem->content(); + foreach(QString functionName, DataSourceManager::instance()->groupFunctionNames()){ + QRegExp rx(QString(GROUP_FUNCTION_RX).arg(functionName)); + if (rx.indexIn(content)>=0){ + content.replace(rx,QString("%1(%2,%3)").arg(functionName).arg('"'+rx.cap(4)+'"').arg('"'+band->objectName()+'"')); + contentItem->setContent(content); + } + } + } + } +} + +void ReportRender::renderBand(BandDesignIntf *patternBand, ReportRender::DataRenderMode mode, bool isLast) +{ + QApplication::processEvents(); + if (patternBand){ + BandDesignIntf* bandClone=renderData(patternBand); + patternBand->emitBandRendered(bandClone); + + if ( isLast && bandClone->keepFooterTogether() && bandClone->sliceLastRow() ){ + if (m_currentMaxHeight < (bandClone->height()+m_reportFooterHeight)) + m_currentMaxHeight -= ((m_currentMaxHeight-bandClone->height())+(bandClone->height()*calcSlicePercent(bandClone->height()))); + } + + if (!bandClone->isEmpty() || patternBand->printIfEmpty()){ + if (!registerBand(bandClone)){ + if (bandClone->canBeSplitted(m_currentMaxHeight)){ + bandClone = sliceBand(bandClone,patternBand,isLast); + } else { + + qreal percent = (bandClone->height()-m_currentMaxHeight)/(bandClone->height()/100); + if (bandClone->maxScalePercent()>=percent){ + if (percentmaxScalePercent()){ + percent += 2; + bandClone->setScale((100-percent)/100); + bandClone->setHeight(m_currentMaxHeight); + registerBand(bandClone); + } + } else { + + if (mode==StartNewPage){ + savePage(); + startNewPage(); + if (!registerBand(bandClone)) { + bandClone->setHeight(m_currentMaxHeight); + registerBand(bandClone); + }; + } + + else { + bandClone->setHeight(m_currentMaxHeight); + registerBand(bandClone); + } + } + } + } + } + if (patternBand->isFooter()) + datasources()->clearGroupFunctionValues(patternBand->objectName()); + } +} + +void ReportRender::renderDataBand(BandDesignIntf *dataBand) +{ + IDataSource* bandDatasource = 0; + if (dataBand) + bandDatasource = datasources()->dataSource(dataBand->datasourceName()); + if(bandDatasource && !bandDatasource->eof() && !m_renderCanceled){ + QString varName = QLatin1String("line_")+dataBand->objectName().toLower(); + datasources()->setReportVariable(varName,1); + renderChildHeader(dataBand,PrintNotAlwaysPrintable); + renderGroupHeader(dataBand,bandDatasource); + while(!bandDatasource->eof() && !m_renderCanceled){ + + if (dataBand->tryToKeepTogether()) openDataGroup(dataBand); + + if (dataBand->keepFooterTogether() && !bandDatasource->hasNext()) + openFooterGroup(dataBand); + + datasources()->updateChildrenData(dataBand->datasourceName()); + m_lastDataBand = dataBand; + renderBand(dataBand,StartNewPage,!bandDatasource->hasNext()); + renderChildBands(dataBand); + + bandDatasource->next(); + + datasources()->setReportVariable(varName,datasources()->variable(varName).toInt()+1); + renderGroupHeader(dataBand,bandDatasource); + if (dataBand->tryToKeepTogether()) closeDataGroup(dataBand); + } + + renderGroupFooter(dataBand); + renderChildFooter(dataBand,PrintNotAlwaysPrintable); + datasources()->deleteVariable(varName); + } else if (bandDatasource==0) { + renderBand(dataBand,StartNewPage); + } +} + +void ReportRender::renderPageHeader(PageItemDesignIntf *patternPage) +{ + BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageHeader); + if (band) renderBand(band); +} + +void ReportRender::renderPageFooter(PageItemDesignIntf *patternPage) +{ + BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageFooter); + if (band){ + BandDesignIntf* bandClone = dynamic_cast(band->cloneItem(PreviewMode, m_renderPageItem,m_renderPageItem)); + replaceGroupsFunction(bandClone); + bandClone->updateItemSize(); + bandClone->setItemPos(m_patternPageItem->pageRect().x(),m_patternPageItem->pageRect().bottom()-bandClone->height()); + bandClone->setHeight(m_pageFooterHeight); + m_currentMaxHeight+=m_pageFooterHeight; + registerBand(bandClone); + datasources()->clearGroupFunctionValues(band->objectName()); + } +} + +void ReportRender::renderPageItems(PageItemDesignIntf* patternPage) +{ + foreach (BaseDesignIntf* item, patternPage->childBaseItems()) { + ItemDesignIntf* id = dynamic_cast(item); + if (id&&id->itemLocation()==ItemDesignIntf::Page){ + BaseDesignIntf* cloneItem = item->cloneItem(m_renderPageItem->itemMode(), + m_renderPageItem, + m_renderPageItem); + cloneItem->updateItemSize(); + } + } +} + +qreal ReportRender::calcPageFooterHeight(PageItemDesignIntf *patternPage) +{ + BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageFooter); + if (band){ + return band->height(); + } + return 0; +} + +void ReportRender::renderChildHeader(BandDesignIntf *parent, BandPrintMode printMode) +{ + foreach(BandDesignIntf* band,parent->childrenByType(BandDesignIntf::SubDetailHeader)){ + bool printAlways=false; + if (band->metaObject()->indexOfProperty("printAlways")>0){ + printAlways=band->property("printAlways").toBool(); + } + if (printAlways == (printMode==PrintAlwaysPrintable) ) renderBand(band,StartNewPage); + } +} + +void ReportRender::renderChildFooter(BandDesignIntf *parent, BandPrintMode printMode) +{ + foreach(BandDesignIntf* band,parent->childrenByType(BandDesignIntf::SubDetailFooter)){ + bool printAlways=false; + if (band->metaObject()->indexOfProperty("printAlways")>0){ + printAlways=band->property("printAlways").toBool(); + } + if (printAlways == (printMode==PrintAlwaysPrintable)) renderBand(band,StartNewPage); + } +} + +void ReportRender::renderChildBands(BandDesignIntf *parentBand) +{ + foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::SubDetailBand)){ + IDataSource* ds = m_datasources->dataSource(band->datasourceName()); + if (ds) ds->first(); + renderChildHeader(band,PrintAlwaysPrintable); + renderDataBand(band); + renderChildFooter(band,PrintAlwaysPrintable); + closeFooterGroup(band); + } +} + +void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* dataSource) +{ + foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::GroupHeader)){ + IGropBand* gb = dynamic_cast(band); + if (gb&&gb->isNeedToClose()){ + if (band->childBands().count()>0){ + dataSource->prior(); + renderBand(band->childBands().at(0),StartNewPage); + dataSource->next(); + } + closeDataGroup(band); + } + if (!gb->isStarted()){ + gb->startGroup(); + openDataGroup(band); + renderBand(band,StartNewPage); + } + } +} + +void ReportRender::renderGroupFooter(BandDesignIntf *parentBand) +{ + foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::GroupHeader)){ + IGropBand* gb = dynamic_cast(band); + if (gb->isStarted()){ + if (band->childBands().count()>0){ + renderBand(band->childBands().at(0),StartNewPage); + } + closeDataGroup(band); + } + } +} + +void ReportRender::initGroupFunctions() +{ + m_datasources->clearGroupFunction(); + foreach(BandDesignIntf* band, m_patternPageItem->childBands()){ + if (band->isFooter()) extractGroupsFunction(band); + } +} + +void ReportRender::popPageFooterGroupValues(BandDesignIntf *dataBand) +{ + BandDesignIntf* pageFooter = m_patternPageItem->bandByType(BandDesignIntf::PageFooter); + if (pageFooter){ + foreach(GroupFunction* gf, datasources()->groupFunctionsByBand(pageFooter->objectName())){ + if ((gf->dataBandName()==dataBand->objectName())){ + // FIXME Probably coincidence Field and Variables + if ((!m_popupedExpression.contains(dataBand))||(!m_popupedExpression.values(dataBand).contains(gf->data()))){ + m_popupedExpression.insert(dataBand,gf->data()); + m_popupedValues.insert(QString::number((long)dataBand,16)+'|'+gf->data(), gf->values()[gf->values().count()-1]); + gf->values().pop_back(); + } + } + } + } +} + +void ReportRender::pushPageFooterGroupValues(BandDesignIntf *dataBand) +{ + BandDesignIntf* pageFooter = m_patternPageItem->bandByType(BandDesignIntf::PageFooter); + if (pageFooter){ + foreach(GroupFunction* gf, datasources()->groupFunctionsByBand(pageFooter->objectName())){ + if ((gf->dataBandName()==dataBand->objectName())){ + // FIXME Probably coincidence Field and Variables + if ((m_popupedExpression.contains(dataBand))&&(m_popupedExpression.values(dataBand).contains(gf->data()))){ + gf->values().push_back(m_popupedValues.value(QString::number((long)dataBand,16)+'|'+gf->data())); + } + } + } + } +} + +void ReportRender::closeGroup(BandDesignIntf *band) +{ + QMultiMap< BandDesignIntf*, GroupBandsHolder* >::iterator it; + it = m_childBands.find(band); + + while (it!=m_childBands.end()&&it.key()==band){ + GroupBandsHolder* bl = it.value(); + if (bl){ + bl->clear(); + delete bl; + } + it++; + } + + m_childBands.remove(band); +} + +void ReportRender::openDataGroup(BandDesignIntf *band) +{ + m_childBands.insert(band,new GroupBandsHolder(band->tryToKeepTogether())); +} + +void ReportRender::openFooterGroup(BandDesignIntf *band) +{ + GroupBandsHolder* holder = new GroupBandsHolder(true); + holder->setIsFooterGroup(); + m_childBands.insert(band,holder); +} + +void ReportRender::closeDataGroup(BandDesignIntf *band) +{ + IGropBand* groupBand = dynamic_cast(band); + if (groupBand) + groupBand->closeGroup(); + closeGroup(band); +} + +void ReportRender::closeFooterGroup(BandDesignIntf *band){ + closeGroup(band); +} + +bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren) +{ + if (band->height()<=m_currentMaxHeight){ + m_currentMaxHeight-=band->height(); + if (band->bandType()!=BandDesignIntf::PageFooter){ + band->setPos(m_renderPageItem->pageRect().x(),m_currentStartDataPos); + m_currentStartDataPos+=band->height(); + band->setBandIndex(++m_currentIndex); + } + + m_renderPageItem->registerBand(band); + + foreach(QList* list,m_childBands.values()){ + if (registerInChildren && + band->bandType()!=BandDesignIntf::PageHeader && + band->bandType()!=BandDesignIntf::PageFooter && + band->bandType()!=BandDesignIntf::ReportHeader && + band->bandType()!=BandDesignIntf::ReportFooter && + !list->contains(band) + ) + list->append(band); + } + if (band->isData()) m_renderedDataBandCount++; + return true; + } else return false; +} + +qreal ReportRender::calcSlicePercent(qreal height){ + return (height*3/(m_dataAreaSize))/100; +} + +BandDesignIntf* ReportRender::sliceBand(BandDesignIntf *band, BandDesignIntf* patternBand, bool isLast) +{ + while (band->height()>m_currentMaxHeight) { + band = saveUppperPartReturnBottom(band,m_currentMaxHeight,patternBand); + if (!band->isEmpty()) { + band->setHeight(0); + band->updateItemSize(); + DataBandDesignIntf* data = dynamic_cast(band); + if (isLast && data && data->keepFooterTogether() && + band->height()sliceLastRow() + ){ + if (band->height()>(m_currentMaxHeight-m_reportFooterHeight)){ + m_currentMaxHeight -= ((m_currentMaxHeight-band->height())+(band->height()*calcSlicePercent(band->height()))); + } + } + if (registerBand(band)) break; + } + } + + if (band->isEmpty()) { + delete band; + band = 0; + + } + + return band; + +} + +void ReportRender::secondRenderPass() +{ + foreach(PageItemDesignIntf::Ptr page, m_renderedPages){ + foreach(BandDesignIntf* band, page->childBands()){ + band->updateItemSize(SecondPass); + } + } +} + +BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf* patternBand) +{ + int sliceHeight = height; + BandDesignIntf* upperBandPart = dynamic_cast(band->cloneUpperPart(sliceHeight)); + BandDesignIntf* bottomBandPart = dynamic_cast(band->cloneBottomPart(sliceHeight)); + if (!bottomBandPart->isEmpty()){ + //bottomBandPart->updateItemSize(FirstPass,height); + if (patternBand->keepFooterTogether()) + closeFooterGroup(patternBand); + } + if (!upperBandPart->isEmpty()){ + upperBandPart->updateItemSize(FirstPass,height); + registerBand(upperBandPart); + } else delete upperBandPart; + savePage(); + startNewPage(); + if (!bottomBandPart->isEmpty() && patternBand->keepFooterTogether()) + openFooterGroup(patternBand); + delete band; + return bottomBandPart; +} + +BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) +{ + BandDesignIntf* bandClone = dynamic_cast(patternBand->cloneItem(PreviewMode)); + if (patternBand->isFooter()){ + replaceGroupsFunction(bandClone); + } + bandClone->updateItemSize(); + return bandClone; +} + +void ReportRender::startNewPage() +{ + m_renderPageItem=0; + + initRenderPage(); + + m_renderPageItem->setObjectName(QLatin1String("ReportPage")+QString::number(m_pageCount)); + m_currentMaxHeight=m_renderPageItem->pageRect().height(); + + m_currentStartDataPos=m_patternPageItem->topMargin()*mmFACTOR; + m_currentIndex=0; + + renderPageHeader(m_patternPageItem); + m_pageFooterHeight = calcPageFooterHeight(m_patternPageItem); + m_currentMaxHeight -= m_pageFooterHeight; + m_currentIndex=10; + m_dataAreaSize = m_currentMaxHeight; + m_renderedDataBandCount = 0; + + pasteGroups(); + renderPageItems(m_patternPageItem); +} + +void ReportRender::cutGroups() +{ + m_popupedExpression.clear(); + m_popupedValues.clear(); + foreach(BandDesignIntf* groupBand,m_childBands.keys()){ + if (m_childBands.value(groupBand)->tryToKeepTogether()){ + foreach(BandDesignIntf* band, *m_childBands.value(groupBand)){ + m_renderPageItem->removeBand(band); + popPageFooterGroupValues(band); + band->setParent(0); + band->setParentItem(0); + } + } + } + +} + +void ReportRender::checkFooterGroup(BandDesignIntf *groupBand) +{ + if (m_childBands.contains(groupBand)){ + GroupBandsHolder* holder = m_childBands.value(groupBand); + foreach(BandDesignIntf* band, *holder){ + qreal percent = band->height()*100 / m_dataAreaSize; + if (m_renderedDataBandCount<=1 || percent>20 ){ + holder->removeAll(band); + } + } + } +} + +void ReportRender::pasteGroups() +{ + BandDesignIntf* groupBand = findEnclosingGroup(); + if (groupBand){ + foreach(BandDesignIntf* band, *m_childBands.value(groupBand)){ + registerBand(band,false); + if (band->isData()) m_renderedDataBandCount++; + pushPageFooterGroupValues(band); + } + foreach(GroupBandsHolder* holder, m_childBands.values()) + holder->setTryToKeepTogether(false); + } + m_popupedExpression.clear(); + m_popupedValues.clear(); +} + +BandDesignIntf* ReportRender::findEnclosingGroup() +{ + BandDesignIntf* result=0; + int groupIndex = -1; + if (!m_childBands.isEmpty()){ + foreach(BandDesignIntf* gb, m_childBands.keys()){ + if (m_childBands.value(gb)->tryToKeepTogether()&& + ((gb->bandIndex()bandIndex(); + } + } + } + return result; +} + +void ReportRender::savePage() +{ + checkFooterGroup(m_lastDataBand); + cutGroups(); + renderPageFooter(m_patternPageItem); + m_pageCount++; + m_datasources->setReportVariable("#PAGE",m_pageCount); + m_datasources->setReportVariable("#PAGE_COUNT",m_pageCount-1); + BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter); + if (pageFooter) pageFooter->setBandIndex(++m_currentIndex); + m_renderedPages.append(PageItemDesignIntf::Ptr(m_renderPageItem)); + emit pageRendered(m_pageCount); +} + +QString ReportRender::toString() +{ + QScopedPointer writer(new XMLWriter()); + foreach(PageItemDesignIntf::Ptr page,m_renderedPages){ + writer->putItem(page.data()); + } + return writer->saveToString(); +} + +ReportRender::~ReportRender(){ + m_renderedPages.clear(); +} + +void ReportRender::cancelRender(){ + m_renderCanceled = true; +} + +} diff --git a/src/lrreportrender.h b/src/lrreportrender.h new file mode 100644 index 0000000..6dd385f --- /dev/null +++ b/src/lrreportrender.h @@ -0,0 +1,151 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRREPORTRENDER_H +#define LRREPORTRENDER_H +#include +#include "lrcollection.h" +#include "lrdatasourcemanager.h" +#include "lrpageitemdesignintf.h" +#include "serializators/lrstorageintf.h" + +namespace LimeReport{ + +class PageDesignIntf; +class BandDesignIntf; + +class GroupBandsHolder: public QList{ +public: + GroupBandsHolder(bool tryToKeepTogether):QList(),m_tryToKeepTogether(tryToKeepTogether), + m_dataGroup(true), m_footerGroup(false){} + bool tryToKeepTogether(){return m_tryToKeepTogether;} + void setTryToKeepTogether(bool value){m_tryToKeepTogether=value;} + bool isDataGroup(){return m_dataGroup;} + bool isFooterGroup(){ return m_footerGroup;} + void setIsFooterGroup(){m_footerGroup=true;m_dataGroup=false;} +private: + bool m_tryToKeepTogether; + bool m_dataGroup; + bool m_footerGroup; +}; + +typedef QList ReportPages; + +class ReportRender: public QObject +{ + Q_OBJECT + Q_PROPERTY(QObject* datasourcesManager READ datasources()) +public: + enum DataRenderMode {StartNewPage,NotStartNewPage}; + enum BandPrintMode {PrintAlwaysPrintable, PrintNotAlwaysPrintable }; + typedef QSharedPointer Ptr; + ~ReportRender(); + ReportRender(QObject *parent = 0); + void setDatasources(DataSourceManager* value); + DataSourceManager* datasources(){return m_datasources;} + void renderPage(PageDesignIntf *patternPage); + int pageCount(); + PageItemDesignIntf::Ptr pageAt(int index); + QString renderPageToString(PageDesignIntf *patternPage); + ReportPages renderPageToPages(PageDesignIntf *patternPage); +signals: + void pageRendered(int renderedPageCount); +public slots: + void cancelRender(); +private: + void initRenderPage(); + void initVariables(); + void clearPageMap(); + void renderBand(BandDesignIntf *patternBand, DataRenderMode mode = NotStartNewPage, bool isLast = false); + void renderDataBand(BandDesignIntf* dataBand); + void renderPageHeader(PageItemDesignIntf* patternPage); + void renderPageFooter(PageItemDesignIntf* patternPage); + void renderPageItems(PageItemDesignIntf* patternPage); + qreal calcPageFooterHeight(PageItemDesignIntf* patternPage); + qreal calcSlicePercent(qreal height); + void renderChildHeader(BandDesignIntf* parent, BandPrintMode printMode); + void renderChildFooter(BandDesignIntf* parent, BandPrintMode printMode); + void renderChildBands(BandDesignIntf* parentBand); + void renderGroupHeader(BandDesignIntf* parentBand, IDataSource* dataSource); + void renderGroupFooter(BandDesignIntf* parentBand); + + void initGroupFunctions(); + void extractGroupsFunction(BandDesignIntf* band); + void replaceGroupsFunction(BandDesignIntf* band); + + void popPageFooterGroupValues(BandDesignIntf* dataBand); + void pushPageFooterGroupValues(BandDesignIntf* dataBand); + + enum GroupType{DATA,FOOTER}; + void closeGroup(BandDesignIntf* band); + void openDataGroup(BandDesignIntf* band); + void closeDataGroup(BandDesignIntf* band); + void openFooterGroup(BandDesignIntf* band); + void closeFooterGroup(BandDesignIntf* band); + void cutGroups(); + void checkFooterGroup(BandDesignIntf* groupBand); + void pasteGroups(); + + BandDesignIntf* findEnclosingGroup(); + bool registerBand(BandDesignIntf* band, bool registerInChildren=true); + BandDesignIntf *sliceBand(BandDesignIntf* band, BandDesignIntf *patternBand, bool isLast); + void secondRenderPass(); + BandDesignIntf* saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf *patternBand); + BandDesignIntf* renderData(BandDesignIntf* patternBand); + void startNewPage(); + void savePage(); + QString toString(); + +private: + DataSourceManager* m_datasources; + + PageItemDesignIntf* m_renderPageItem; + PageItemDesignIntf* m_patternPageItem; + QList m_renderedPages; + + QMultiMap< BandDesignIntf*, GroupBandsHolder* > m_childBands; + + int m_currentMaxHeight; + int m_currentStartDataPos; + int m_currentIndex; + int m_pageCount; + + QMap m_popupedValues; + QMultiMap m_popupedExpression; + + qreal m_pageFooterHeight; + qreal m_dataAreaSize; + qreal m_reportFooterHeight; + int m_renderedDataBandCount; + BandDesignIntf* m_lastDataBand; + bool m_renderCanceled; + +}; +} // namespace LimeReport +#endif // LRREPORTRENDER_H diff --git a/src/lrscriptenginemanager.cpp b/src/lrscriptenginemanager.cpp new file mode 100644 index 0000000..6c6723e --- /dev/null +++ b/src/lrscriptenginemanager.cpp @@ -0,0 +1,459 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrscriptenginemanager.h" + +#include +#include +#include +#include "lrdatasourcemanager.h" + +Q_DECLARE_METATYPE(QColor) +Q_DECLARE_METATYPE(QFont) + +QScriptValue constructColor(QScriptContext *context, QScriptEngine *engine) +{ + QColor color(context->argument(0).toString()); + return engine->toScriptValue(color); +} + +namespace LimeReport{ + +ScriptEngineNode::~ScriptEngineNode() +{ + for (int i = 0; im_childs.indexOf(const_cast(this)); + } + return 0; +} + +void ScriptEngineNode::clear() +{ + for (int i=0; iparent(); + if ((parentNode == m_rootNode) || (!parentNode)) return QModelIndex(); + return createIndex(parentNode->row(),0,parentNode); +} + +QModelIndex ScriptEngineModel::index(int row, int column, const QModelIndex& parent) const +{ + if (!m_rootNode) + return QModelIndex(); + + if (!hasIndex(row,column,parent)) + return QModelIndex(); + + ScriptEngineNode* parentNode; + if (parent.isValid()){ + parentNode = nodeFromIndex(parent); + } else { + parentNode = m_rootNode; + } + + ScriptEngineNode* childNode = parentNode->child(row); + if (childNode){ + return createIndex(row,column,childNode); + } else return QModelIndex(); +} + +int ScriptEngineModel::rowCount(const QModelIndex& parent) const +{ + if (!m_rootNode) return 0; + ScriptEngineNode* parentNode; + if (parent.isValid()) + parentNode = nodeFromIndex(parent); + else + parentNode = m_rootNode; + return parentNode->childCount(); +} + +int ScriptEngineModel::columnCount(const QModelIndex& parent) const +{ + Q_UNUSED(parent) + return 1; +} + +QVariant ScriptEngineModel::data(const QModelIndex& index, int role) const +{ + ScriptEngineNode *node = nodeFromIndex(index); + switch (role) { + case Qt::DisplayRole: + if (!node) return QVariant(); + return node->name(); + break; + case Qt::DecorationRole : + if (!node) return QIcon(); + return node->icon(); + break; + default: + return QVariant(); + } +} + +void ScriptEngineModel::setScriptEngineManager(ScriptEngineManager* scriptManager) +{ + m_scriptManager = scriptManager; + updateModel(); +} + +void ScriptEngineModel::slotScriptEngineChanged() +{ + updateModel(); +} + +ScriptEngineNode*ScriptEngineModel::nodeFromIndex(const QModelIndex& index) const +{ + if (index.isValid()){ + return static_cast(index.internalPointer()); + } else return m_rootNode; +} + +void ScriptEngineModel::updateModel() +{ + beginResetModel(); + m_rootNode->clear(); + QMap categories; + foreach(ScriptFunctionDesc funcDesc, m_scriptManager->functionsDescriber()){ + ScriptEngineNode* categ; + QString categoryName = (!funcDesc.category.isEmpty())?funcDesc.category:"NO CATEGORY"; + if (categories.contains(categoryName)){ + categ = categories.value(categoryName); + } else { + categ = m_rootNode->addChild(categoryName,ScriptEngineNode::Category,QIcon(":/report/images/folder")); + categories.insert(categoryName,categ); + } + categ->addChild(funcDesc.name,ScriptEngineNode::Function,QIcon(":/report/images/function")); + } + //reset(); + endResetModel(); +} + +QScriptValue dateToStr(QScriptContext* pcontext, QScriptEngine* pengine){ + DataSourceManager* dm = DataSourceManager::instance(); + QString field = pcontext->argument(0).toString(); + QString format = pcontext->argument(1).toString(); + QScriptValue res; + if (dm->containsField(field)){ + res=pengine->newVariant(QLocale().toString(dm->fieldData(field).toDate(),format)); + } else { + QString error = (!dm->lastError().isNull())?dm->lastError():QString("Field %1 not found").arg(field); + res=pengine->newVariant(error); + } + return res; +} + +QScriptValue line(QScriptContext* pcontext, QScriptEngine* pengine){ + DataSourceManager* dm=DataSourceManager::instance(); + QString band = pcontext->argument(0).toString(); + QScriptValue res; + QString varName = QLatin1String("line_")+band.toLower(); + if (dm->variable(varName).isValid()){ + res=pengine->newVariant(dm->variable(varName)); + } else res=pengine->newVariant(QString("Variable line for band %1 not found").arg(band)); + return res; +} + +QScriptValue numberFormat(QScriptContext* pcontext, QScriptEngine* pengine){ + QVariant value = pcontext->argument(0).toVariant(); + char format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString()[0].toLatin1():'f'; + int precision = (pcontext->argumentCount()>2)?pcontext->argument(2).toInt32():2; + QScriptValue res = pengine->newVariant(QString::number(value.toDouble(),format,precision)); + return res; +} + +QScriptValue dateFormat(QScriptContext* pcontext, QScriptEngine* pengine){ + QVariant value = pcontext->argument(0).toVariant(); + QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy"; + QScriptValue res = pengine->newVariant(QLocale().toString(value.toDate(),format)); + return res; +} + +QScriptValue now(QScriptContext* /*pcontext*/, QScriptEngine* pengine){ + return pengine->newVariant(QDate::currentDate()); +} + +QScriptValue callGroupFunction(const QString& functionName, QScriptContext* pcontext, QScriptEngine* pengine){ + + DataSourceManager* dm=DataSourceManager::instance(); + QString expression = pcontext->argument(0).toString(); + QString band = pcontext->argument(1).toString(); + QScriptValue res; + GroupFunction* gf = dm->groupFunction(functionName,expression,band); + if (gf){ + if (gf->isValid()){ + res=pengine->newVariant(gf->calculate()); + }else{ + res=pengine->newVariant(gf->error()); + } + } + else { + res=pengine->newVariant(QString(QObject::tr("Function %1 not found or have wrong arguments").arg(functionName))); + } + return res; +} + +QScriptValue groupFunction(QScriptContext* pcontext, QScriptEngine* pengine){ + return callGroupFunction(pcontext->callee().property("functionName").toString(),pcontext,pengine); +} + +ScriptEngineManager::~ScriptEngineManager() +{ + if (m_model){ + delete m_model; + m_model=0; + } + delete m_scriptEngine; +} + +QScriptValue ScriptEngineManager::addFunction(const QString& name, + QScriptEngine::FunctionSignature function, + const QString& category, + const QString& description) +{ + ScriptFunctionDesc funct; + funct.name = name; + funct.description = description; + funct.category = category; + funct.scriptValue = scriptEngine()->newFunction(function); + funct.scriptValue.setProperty("functionName",name); + funct.type = ScriptFunctionDesc::Native; + m_functions.append(funct); + if (m_model) + m_model->updateModel(); + return funct.scriptValue; +} + +QScriptValue ScriptEngineManager::addFunction(const QString& name,const QString& script, const QString& category, const QString& description) +{ + QScriptSyntaxCheckResult cr = m_scriptEngine->checkSyntax(script); + if (cr.state() == QScriptSyntaxCheckResult::Valid){ + ScriptFunctionDesc funct; + funct.scriptValue = m_scriptEngine->evaluate(script); + funct.name = name; + funct.category = category; + funct.description = description; + funct.type = ScriptFunctionDesc::Script; + m_functions.append(funct); + m_model->updateModel(); + return funct.scriptValue; + } else { + m_lastError = cr.errorMessage(); + return QScriptValue(); + } +} + +QStringList ScriptEngineManager::functionsNames() +{ + QStringList res; + foreach(ScriptFunctionDesc func, m_functions){ + res<newFunction(constructColor); + m_scriptEngine->globalObject().setProperty("QColor", colorCtor); + + QScriptValue fontProto(m_scriptEngine->newQObject(new QFontPrototype,QScriptEngine::ScriptOwnership)); + m_scriptEngine->setDefaultPrototype(qMetaTypeId(), fontProto); + QScriptValue fontConstructor = m_scriptEngine->newFunction(QFontPrototype::constructorQFont, fontProto); + m_scriptEngine->globalObject().setProperty("QFont", fontConstructor); + + DataSourceManager* dm=DataSourceManager::instance(); + foreach(QString func, dm->groupFunctionNames()){ + addFunction(func,groupFunction,"GROUP FUNCTIONS"); + } + + foreach(ScriptFunctionDesc func, m_functions){ + if (func.type==ScriptFunctionDesc::Native) + m_scriptEngine->globalObject().setProperty(func.name,func.scriptValue); + } + + m_model = new ScriptEngineModel(this); + +} + +bool ScriptExtractor::parse() +{ + int currentPos = 0; + parse(currentPos,None); + return m_scriptsBody.count()>0; + +} + +bool ScriptExtractor::parse(int &curPos,const State& state) +{ + while (curPos. * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSCRIPTENGINEMANAGER_H +#define LRSCRIPTENGINEMANAGER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "base/lrsingleton.h" +#include "lrscriptenginemanagerintf.h" + +namespace LimeReport{ + +struct ScriptFunctionDesc{ + enum FuncType {Native,Script}; + QScriptValue scriptValue; + QString name; + QString description; + QString category; + FuncType type; +}; + +class ScriptEngineNode { +public: + enum NodeType{Root,Category,Function}; + ScriptEngineNode(const QString& name="", NodeType type=Root, ScriptEngineNode* parent=0, const QIcon& icon=QIcon()) + :m_name(name), m_icon(icon), m_type(type), m_parent(parent){} + virtual ~ScriptEngineNode(); + int childCount(){return m_childs.count();} + ScriptEngineNode* child(int index){return m_childs[index];} + ScriptEngineNode* parent(){return m_parent;} + ScriptEngineNode* addChild(const QString& name="", NodeType type=Root, const QIcon& icon=QIcon()); + int row(); + QString name(){return m_name;} + QIcon icon(){return m_icon;} + void clear(); + NodeType type(){return m_type;} +private: + QString m_name; + QIcon m_icon; + NodeType m_type; + ScriptEngineNode* m_parent; + QVector m_childs; +}; + +class ScriptEngineManager; + +class ScriptEngineModel : public QAbstractItemModel{ + Q_OBJECT +public: + friend class ScriptEngineManager; + explicit ScriptEngineModel():m_rootNode(new ScriptEngineNode()){} + ~ScriptEngineModel(); + explicit ScriptEngineModel(ScriptEngineManager* scriptManager); + QModelIndex parent(const QModelIndex &child) const; + QModelIndex index(int row, int column, const QModelIndex &parent) const; + int rowCount(const QModelIndex &parent) const; + int columnCount(const QModelIndex &parent) const; + QVariant data(const QModelIndex &index, int role) const; + void setScriptEngineManager(ScriptEngineManager* scriptManager); +private slots: + void slotScriptEngineChanged(); +private: + ScriptEngineNode* nodeFromIndex(const QModelIndex &index) const; + void updateModel(); +private: + ScriptEngineManager* m_scriptManager; + ScriptEngineNode* m_rootNode; +}; + +class ScriptEngineManager : public QObject, public Singleton, public IScriptEngineManager +{ + Q_OBJECT +public: + QScriptEngine* scriptEngine(){return m_scriptEngine;} + ~ScriptEngineManager(); + friend class Singleton; + QScriptValue addFunction(const QString& name, QScriptEngine::FunctionSignature function, + const QString& category="", const QString& description=""); + QScriptValue addFunction(const QString &name, const QString& script, + const QString &category="", const QString &description=""); + const QString& lastError() const {return m_lastError;} + QStringList functionsNames(); + const QList& functionsDescriber(){return m_functions;} + ScriptEngineModel* model(){return m_model;} +private: + Q_DISABLE_COPY(ScriptEngineManager) +private: + ScriptEngineManager(); + QScriptEngine* m_scriptEngine; + QString m_lastError; + QList m_functions; + ScriptEngineModel* m_model; +}; + +class ScriptExtractor +{ +public: + enum State{None,BuksFound,SFound,StartScriptFound,OpenBracketFound,CloseBracketFound,DFound,VFound, SignFound}; + explicit ScriptExtractor(const QString& value):m_context(value){} + bool parse(); + int count(){return m_scriptsBody.count();} + QString bodyAt(int index){return m_scriptsBody[index];} + QString scriptAt(int index){return m_scriptsStartLex[index]+m_scriptsBody[index]+'}';} + +private: + static const char SCRIPT_SIGN = 'S'; + static const char FIELD_SIGN = 'D'; + static const char VARIABLE_SIGN = 'V'; + + bool isStartLexem(int &curPos, QChar value); + bool parse(int& curPos, const State &state); + void skipField(int &curPos); + void extractScript(int& curPos, const QString &startStr); + bool extractBracket(int& curPos); + bool isStartScriptLexem(int &curPos); + bool isStartFieldLexem(int &curPos); + bool isStartVariableLexem(int &curPos); + QString substring(const QString& value, int start, int end); +private: + QString m_context; + QVector m_scriptsBody; + QVector m_scriptsStartLex; + +}; + +class QFontPrototype : public QObject, public QScriptable { + Q_OBJECT + Q_PROPERTY(QString family READ family) + Q_PROPERTY(int size READ size) + Q_PROPERTY(bool bold READ bold) + Q_PROPERTY(bool italic READ italic) + Q_PROPERTY(bool underline READ underline) +public: + QFontPrototype(QObject * parent = NULL) : QObject(parent) , QScriptable() { + this->setObjectName("QFontPrototype"); + } + QString family() const { + QFont font(qScriptValueToValue(this->thisObject())); + return font.family(); + } + int size(){ + QFont font = qScriptValueToValue(thisObject()); + return font.pointSize(); + } + bool bold(){ + QFont font = qScriptValueToValue(thisObject()); + return font.bold(); + } + bool italic(){ + QFont font = qScriptValueToValue(thisObject()); + return font.italic(); + } + bool underline(){ + QFont font = qScriptValueToValue(thisObject()); + return font.underline(); + } + static QScriptValue constructorQFont(QScriptContext * context, QScriptEngine * engine) { + QFont font; + switch (context->argumentCount()) { + case 5: font.setUnderline(qScriptValueToValue(context->argument(4))); + case 4: font.setBold(qScriptValueToValue(context->argument(3))); + case 3: font.setItalic(qScriptValueToValue(context->argument(2))); + case 2: font.setPointSize(qScriptValueToValue(context->argument(1))); + case 1: font.setFamily(qScriptValueToValue(context->argument(0))); + case 0: break; + default: + break; + } + return qScriptValueFromValue(engine, font); + } +}; + +} +#endif // LRSCRIPTENGINEMANAGER_H diff --git a/src/lrscriptenginemanagerintf.h b/src/lrscriptenginemanagerintf.h new file mode 100644 index 0000000..56284da --- /dev/null +++ b/src/lrscriptenginemanagerintf.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSCRIPTENGINEMANAGERINTF_H +#define LRSCRIPTENGINEMANAGERINTF_H + +#include + +namespace LimeReport{ + +class IScriptEngineManager{ +public: + virtual QScriptEngine* scriptEngine() = 0; + virtual QScriptValue addFunction(const QString& name, QScriptEngine::FunctionSignature function, + const QString& category="", const QString& description="") = 0; + virtual QScriptValue addFunction(const QString &name, const QString& script, + const QString &category="", const QString &description="") = 0; + virtual const QString& lastError() const = 0; + virtual ~IScriptEngineManager(){} +}; + +} //namespace LimeReport +#endif // LRSCRIPTENGINEMANAGERINTF_H diff --git a/src/lrserializatorsfactory.cpp b/src/lrserializatorsfactory.cpp new file mode 100644 index 0000000..b1757f5 --- /dev/null +++ b/src/lrserializatorsfactory.cpp @@ -0,0 +1,30 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ + diff --git a/src/lrserializatorsfactory.h b/src/lrserializatorsfactory.h new file mode 100644 index 0000000..111484d --- /dev/null +++ b/src/lrserializatorsfactory.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef ASERIALIZATORSFACTORY_H +#define ASERIALIZATORSFACTORY_H +#include "asimpleabstractfactory.h" +#include "serializators/aserializatorintf.h" + +namespace LimeReport{ + +typedef SerializatorIntf* (*CreateSerializator)(QObject* parent); + +class SerializatorsFactory: public SimpleAbstractFactory +{ +private: + friend class Singleton; +public: + SerializatorsFactory(); + ~SerializatorsFactory(){} + SerializatorsFactory(const SerializatorsFactory&){} + SerializatorsFactory& operator = (const SerializatorsFactory&){return *this;} +}; + +} +#endif // ASERIALIZATORSFACTORY_H diff --git a/src/lrsimplecrypt.cpp b/src/lrsimplecrypt.cpp new file mode 100644 index 0000000..0b9aa06 --- /dev/null +++ b/src/lrsimplecrypt.cpp @@ -0,0 +1,183 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrsimplecrypt.h" + +#if defined(LP64) || defined(_LP64) || defined(__LP64__) +typedef unsigned int WORD; /* Should be 32-bit = 4 bytes */ +#else +typedef unsigned long int WORD; /* Should be 32-bit = 4 bytes */ +#endif + +const int w = 32; /* word size in bits */ +const int r = 12; /* number of rounds */ +const int b = 16; /* number of bytes in key */ +const int c = 4; /* number words in key = ceil(8*b/w)*/ +const int t = 26; /* size of table S = 2*(r+1) words */ + +WORD P = 0xb7e15163, Q = 0x9e3779b9; + +#define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1))))) +#define ROTR(x,y) (((x)>>(y&(w-1))) | ((x)<<(w-(y&(w-1))))) + +union WTB{ + WORD word[2]; + char bytes[8]; +}; + +void initPt(WTB& pt, QByteArray::Iterator* it, QByteArray::Iterator end){ + for (int i = 0; i<8; i++){ + if (*it != end){ + pt.bytes[i]=**it; + ++*it; + } else break; + } +} + +namespace LimeReport { + +class ChipperPrivate{ + friend class Chipper; +private: + void RC5_SETUP(const char *K); + void RC5_ENCRYPT(WORD *pt, WORD *ct); + void RC5_DECRYPT(WORD *ct, WORD *pt); + WORD S[26]; +}; + +void ChipperPrivate::RC5_SETUP(const char *K) +{ + WORD i, j, k, u=w/8, A, B, L[c]; + for (i=b,L[c-1]=0; i!=0; i--) + L[(i-1)/u] = (L[(i-1)/u]<<8)+K[i-1]; + for (S[0]=P,i=1; i 3*c */ + A = S[i] = ROTL(S[i]+(A+B),3); + B = L[j] = ROTL(L[j]+(A+B),(A+B)); + } +} + +void ChipperPrivate::RC5_ENCRYPT(WORD *pt, WORD *ct) +{ + WORD i, A=pt[0]+S[0], B=pt[1]+S[1]; + for (i=1; i<=r; i++) + { A = ROTL(A^B,B)+S[2*i]; + B = ROTL(B^A,A)+S[2*i+1]; + } + ct[0] = A; ct[1] = B; +} + +void ChipperPrivate::RC5_DECRYPT(WORD *ct, WORD *pt) +{ + WORD i, B=ct[1], A=ct[0]; + for (i=r; i>0; i--) + { B = ROTR(B-S[2*i+1],A)^A; + A = ROTR(A-S[2*i],B)^B; + } + pt[1] = B-S[1]; pt[0] = A-S[0]; +} + +QByteArray Chipper::cryptString(QString value) +{ + QByteArray buff; + QByteArray result; + buff += value; + WTB pt, ct, prior; + + d->RC5_SETUP("HjccbzHjlbyfCkjy"); + + prior.word[0]=0; + prior.word[1]=0; + + QByteArray::Iterator it = buff.begin(); + while (it!=buff.end()){ + + pt.word[0] = 0; + pt.word[1] = 0; + + initPt(pt,&it,buff.end()); + + pt.word[0] = pt.word[0] ^ prior.word[0]; + pt.word[1] = pt.word[1] ^ prior.word[1]; + + d->RC5_ENCRYPT(pt.word,ct.word); + + prior.word[0] = pt.word[0]; + prior.word[1] = pt.word[1]; + + for (int i=0;i<8;i++){ + result += ct.bytes[i]; + } + } + return result; +} + +QString Chipper::decryptByteArray(QByteArray value) +{ + QByteArray result; + WTB pt, ct, prior; + + d->RC5_SETUP("HjccbzHjlbyfCkjy"); + prior.word[0] = 0; + prior.word[1] = 0; + + QByteArray::Iterator it = value.begin(); + while (it!=value.end()){ + + pt.word[0] = 0; + pt.word[1] = 0; + + initPt(pt,&it,value.end()); + + d->RC5_DECRYPT(pt.word,ct.word); + + ct.word[0] = ct.word[0] ^ prior.word[0]; + ct.word[1] = ct.word[1] ^ prior.word[1]; + + prior.word[0] = ct.word[0]; + prior.word[1] = ct.word[1]; + + for (int i=0;i<8;i++){ + result += ct.bytes[i]; + } + + } + return QString(result); +} + +Chipper::Chipper(): d(new ChipperPrivate()){} + +Chipper::~Chipper() +{ + delete d; +} + +} + diff --git a/src/lrsimplecrypt.h b/src/lrsimplecrypt.h new file mode 100644 index 0000000..68978b5 --- /dev/null +++ b/src/lrsimplecrypt.h @@ -0,0 +1,52 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSIMPLECRYPT_H +#define LRSIMPLECRYPT_H + +#include +#include +#include + +namespace LimeReport { + +class ChipperPrivate; +class Chipper{ +public: + QByteArray cryptString(QString value); + QString decryptByteArray(QByteArray value); + Chipper(); + ~Chipper(); +private: + ChipperPrivate* d; +}; + +} + +#endif // LRSIMPLECRYPT_H diff --git a/src/lrvariablesholder.cpp b/src/lrvariablesholder.cpp new file mode 100644 index 0000000..7b3d224 --- /dev/null +++ b/src/lrvariablesholder.cpp @@ -0,0 +1,147 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrvariablesholder.h" +#include +#include +#include + +namespace LimeReport{ + +AVariablesHolder::AVariablesHolder(QObject *parent) : + QObject(parent) +{ +} + +AVariablesHolder::~AVariablesHolder() +{ + QMap::iterator it = m_varNames.begin(); + while(it!=m_varNames.end()){ + delete *it; + it++; + } + m_varNames.clear(); + m_userVariables.clear(); +} + +void AVariablesHolder::addVariable(const QString& name, const QVariant& value, VarDesc::VarType type, RenderPass pass) +{ + if (!m_varNames.contains(name)){ + VarDesc* varValue = new VarDesc; + varValue->setName(name); + varValue->setValue(value); + varValue->setVarType(type); + varValue->setRenderPass(pass); + m_varNames.insert(name,varValue); + if (type==VarDesc::User) + m_userVariables.append(varValue); + } else { + throw ReportError(tr("variable with name ")+name+tr(" already exists !!")); + } +} + +QVariant AVariablesHolder::variable(const QString &name) +{ + if (m_varNames.contains(name)) + return m_varNames.value(name)->value(); + else return QVariant(); +} + +VarDesc::VarType AVariablesHolder::variableType(const QString &name) +{ + if (m_varNames.contains(name)) + return m_varNames.value(name)->varType(); + else throw ReportError(tr("variable with name ")+name+tr(" does not exists !!")); +} + +void AVariablesHolder::deleteVariable(const QString &name) +{ + if (m_varNames.contains(name)) { + m_userVariables.removeOne(m_varNames.value(name)); + delete m_varNames.value(name); + m_varNames.remove(name); + } +} + +void AVariablesHolder::changeVariable(const QString &name, const QVariant &value) +{ + if(m_varNames.contains(name)) { + m_varNames.value(name)->setValue(value); + } else + throw ReportError(tr("variable with name ")+name+tr(" does not exists !!")); +} + +void AVariablesHolder::clearUserVariables() +{ + QMap::iterator it = m_varNames.begin(); + while (it != m_varNames.end()){ + if (it.value()->varType()==VarDesc::User){ + m_userVariables.removeAll(it.value()); + delete it.value(); + it = m_varNames.erase(it); + } else { + ++it; + } + + } + +} + +bool AVariablesHolder::containsVariable(const QString &name) +{ + return m_varNames.contains(name); +} + +int AVariablesHolder::userVariablesCount() +{ + return m_userVariables.count(); +} + +VarDesc *AVariablesHolder::userVariableAt(int index) +{ + return m_userVariables.at(index); +} + +QStringList AVariablesHolder::variableNames() +{ + QStringList result; + foreach(QString varName,m_varNames.keys()){ + result<renderPass(); + else throw ReportError(tr("variable with name ")+name+tr(" does not exists !!")); +} + +}// namespace LimeReport diff --git a/src/lrvariablesholder.h b/src/lrvariablesholder.h new file mode 100644 index 0000000..c55397f --- /dev/null +++ b/src/lrvariablesholder.h @@ -0,0 +1,102 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef VARIABLEHOLDER_H +#define VARIABLEHOLDER_H + +#include +#include +#include +#include +#include "lrglobal.h" + +namespace LimeReport{ + +class VarDesc : public QObject{ + Q_OBJECT + Q_PROPERTY(QString name READ name WRITE setName) + Q_PROPERTY(QVariant value READ value WRITE setValue) +public: + enum VarType {System,User}; + void setVarType(VarType value){m_varType=value;} + VarType varType(){return m_varType;} + void setRenderPass(RenderPass value){m_varPass=value;} + RenderPass renderPass(){return m_varPass;} + void setName(QString value){m_name=value;} + QString name(){return m_name;} + void setValue(QVariant value){m_value=value;} + QVariant value(){return m_value;} +private: + VarType m_varType; + RenderPass m_varPass; + QString m_name; + QVariant m_value; +}; + +class IVariablesContainer +{ +public: + virtual ~IVariablesContainer(){} + virtual void addVariable(const QString &name, const QVariant &value, VarDesc::VarType type=VarDesc::User, RenderPass pass=FirstPass)=0; + virtual void deleteVariable(const QString &name)=0; + virtual void changeVariable(const QString &name, const QVariant &value)=0; + virtual void clearUserVariables()=0; + virtual QVariant variable(const QString &name)=0; + virtual VarDesc::VarType variableType(const QString &name)=0; + virtual RenderPass variablePass(const QString &name)=0; + virtual bool containsVariable(const QString &name)=0; + virtual QStringList variableNames()=0; +}; + +class AVariablesHolder : public QObject, public IVariablesContainer +{ + Q_OBJECT +public: + explicit AVariablesHolder(QObject *parent = 0); + ~AVariablesHolder(); + void addVariable(const QString &name, const QVariant &value, VarDesc::VarType type=VarDesc::User, RenderPass pass=FirstPass); + void deleteVariable(const QString &name); + void changeVariable(const QString &name, const QVariant &value); + void clearUserVariables(); + QVariant variable(const QString &name); + VarDesc::VarType variableType(const QString &name); + RenderPass variablePass(const QString &name); + bool containsVariable(const QString &name); + QStringList variableNames(); + int userVariablesCount(); + VarDesc* userVariableAt(int index); +signals: +private: + QMap m_varNames; + QList m_userVariables; +}; + +}// namespace LimeReport + +#endif // VARIABLEHOLDER_H diff --git a/src/objectinspector/editors/lrbuttonlineeditor.cpp b/src/objectinspector/editors/lrbuttonlineeditor.cpp new file mode 100644 index 0000000..33095db --- /dev/null +++ b/src/objectinspector/editors/lrbuttonlineeditor.cpp @@ -0,0 +1,140 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrbuttonlineeditor.h" +#include +#include +#include +#include +#include +#include +#include +#include "lrtextitempropertyeditor.h" + +ButtonLineEditor::ButtonLineEditor(const QString &propertyName, QWidget *parent) : + QWidget(parent), m_overButton(false), m_editor(0), m_propertyName(propertyName) +{ + m_lineEdit = new QLineEdit(this); + m_lineEdit->installEventFilter(this); + setFocusProxy(m_lineEdit); + m_buttonEdit = new QToolButton(this); + m_buttonEdit->setText("..."); + m_buttonEdit->installEventFilter(this); + m_buttonEdit->setAttribute(Qt::WA_Hover); + + QHBoxLayout *layout = new QHBoxLayout(this); + layout->addWidget(m_lineEdit); + layout->addWidget(m_buttonEdit); + layout->setContentsMargins(1,1,1,1); + layout->setSpacing(0); + setAutoFillBackground(true); + connect(m_buttonEdit,SIGNAL(clicked()),this,SLOT(editButtonClicked())); + //connect(m_lineEdit,SIGNAL(editingFinished()),this,SLOT(lineEditEditingFinished())); +} + +ButtonLineEditor::~ButtonLineEditor() +{ + if (m_editor) { + delete m_editor; + m_editor = 0; + } +} + +void ButtonLineEditor::editButtonClicked() +{ + + if (!m_editor){ + m_editor = new TextItemPropertyEditor(QApplication::activeWindow()); + m_editor->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, m_editor->size(), QApplication::desktop()->availableGeometry())); + m_editor->setWindowTitle(m_propertyName); + m_editor->setText(m_lineEdit->text()); + connect(m_editor,SIGNAL(accepted()),this,SLOT(editingByEditorFinished())); + m_editor->exec(); + } else m_editor->exec(); +} + +void ButtonLineEditor::setText(const QString &value){ + m_lineEdit->setText(value); +} + +QString ButtonLineEditor::text() +{ + return m_lineEdit->text(); +} + +bool ButtonLineEditor::eventFilter(QObject *target, QEvent *event) +{ + + if (target==m_buttonEdit) { + + if (event->type()==QEvent::HoverEnter){ + m_overButton=true; + } + if (event->type()==QEvent::HoverLeave){ + m_overButton=false; + } + if (event->type()==QEvent::FocusOut){ + if (static_cast(event)->reason()!=Qt::MouseFocusReason){ + m_lineEdit->setFocus(); + } + } + QSet enterKeys; + enterKeys.insert(Qt::Key_Enter); + enterKeys.insert(Qt::Key_Return); + + if (event->type()==QEvent::KeyPress){ + if (enterKeys.contains(static_cast(event)->key())){ + m_buttonEdit->click(); + return true; + } + } + } + if (target==m_lineEdit){ + if (event->type()==QEvent::FocusOut){ + switch (static_cast(event)->reason()){ + case Qt::TabFocusReason: + m_overButton=true; + break; + case Qt::MouseFocusReason: + break; + default: + m_overButton=false; + } + + } + } + return QWidget::eventFilter(target,event); + +} + +void ButtonLineEditor::editingByEditorFinished() +{ + setText(qobject_cast(sender())->text()); + m_lineEdit->setFocus(); +} diff --git a/src/objectinspector/editors/lrbuttonlineeditor.h b/src/objectinspector/editors/lrbuttonlineeditor.h new file mode 100644 index 0000000..6e41b1f --- /dev/null +++ b/src/objectinspector/editors/lrbuttonlineeditor.h @@ -0,0 +1,66 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRBUTTONLINEEDIT_H +#define LRBUTTONLINEEDIT_H + +#include +#include +#include +#include +#include +#include +#include "lrtextitempropertyeditor.h" + + +class ButtonLineEditor : public QWidget +{ + Q_OBJECT +public: + explicit ButtonLineEditor(const QString& propertyName,QWidget *parent = 0); + ~ButtonLineEditor(); + void setText(const QString &value); + QString text(); +signals: + void editingFinished(); +public slots: + void editButtonClicked(); + void editingByEditorFinished(); +private: + QLineEdit* m_lineEdit; + QToolButton* m_buttonEdit; + bool m_overButton; + TextItemPropertyEditor *m_editor; + QString m_propertyName; +private: + bool eventFilter(QObject *, QEvent *); + //QHBoxLayout* m_layout; +}; + +#endif // LRBUTTONLINEEDIT_H diff --git a/src/objectinspector/editors/lrcheckboxeditor.cpp b/src/objectinspector/editors/lrcheckboxeditor.cpp new file mode 100644 index 0000000..ec61301 --- /dev/null +++ b/src/objectinspector/editors/lrcheckboxeditor.cpp @@ -0,0 +1,115 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrcheckboxeditor.h" +#include +#include +#include +#include +#include +#include + +namespace LimeReport{ + +CheckBoxEditor::CheckBoxEditor(QWidget *parent) + :QWidget(parent), m_editing(false) +{ + m_checkBox = new QCheckBox(this); + init(); +} +CheckBoxEditor::CheckBoxEditor(const QString &text, QWidget *parent) + :QWidget(parent), m_editing(false) +{ + m_checkBox = new QCheckBox(text,this); + init(); +} + +CheckBoxEditor::~CheckBoxEditor(){} + +void CheckBoxEditor::init() +{ + QVBoxLayout *layout=new QVBoxLayout(this); + layout->addStretch(); + layout->addWidget(m_checkBox); + m_checkBox->setFocusPolicy(Qt::NoFocus); + connect(m_checkBox, SIGNAL(stateChanged(int)), this, SLOT(slotStateChanged(int))); + layout->addStretch(); + layout->setContentsMargins(2,1,1,1); + layout->setSpacing(0); + setLayout(layout); + setAutoFillBackground(true); + setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); +} + +void CheckBoxEditor::setEditing(bool value) +{ + m_editing=value; +} + +void CheckBoxEditor::setChecked(bool value) +{ + m_checkBox->setChecked(value); +} + +bool CheckBoxEditor::isChecked() +{ + return m_checkBox->isChecked(); +} + +void CheckBoxEditor::mousePressEvent(QMouseEvent *) +{ + m_checkBox->setChecked(!m_checkBox->isChecked()); + emit editingFinished(); +} + +void CheckBoxEditor::keyPressEvent(QKeyEvent *event) +{ + if (event->key()==Qt::Key_Space) m_checkBox->setChecked(!m_checkBox->isChecked()); + if ((event->key() == Qt::Key_Up) || (event->key() == Qt::Key_Down)){ + emit editingFinished(); + } + QWidget::keyPressEvent(event); +} + +void CheckBoxEditor::showEvent(QShowEvent *) +{ + int border = (height() - QApplication::style()->pixelMetric(QStyle::PM_IndicatorWidth))/2 +#ifdef Q_OS_MAC + +QApplication::style()->pixelMetric(QStyle::PM_FocusFrameVMargin) +#endif + ; + layout()->setContentsMargins(border,0,0,0); +} + +void CheckBoxEditor::slotStateChanged(int) +{ + emit editingFinished(); +} + +} diff --git a/src/objectinspector/editors/lrcheckboxeditor.h b/src/objectinspector/editors/lrcheckboxeditor.h new file mode 100644 index 0000000..67c95bf --- /dev/null +++ b/src/objectinspector/editors/lrcheckboxeditor.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRCHECKBOXEDITOR_H +#define LRCHECKBOXEDITOR_H + +#include + +namespace LimeReport{ + +class CheckBoxEditor : public QWidget +{ + Q_OBJECT + +public: + CheckBoxEditor(QWidget * parent = 0); + CheckBoxEditor(const QString & text, QWidget * parent = 0); + ~CheckBoxEditor(); + void setEditing(bool value); + void setChecked(bool value); + bool isChecked(); +protected: + void mousePressEvent(QMouseEvent *); + void keyPressEvent(QKeyEvent *event); + void showEvent(QShowEvent *); +signals: + void editingFinished(); +private slots: + void slotStateChanged(int); +private: + QCheckBox* m_checkBox; + bool m_editing; + void init(); + +}; + +} +#endif // LRCHECKBOXEDITOR_H diff --git a/src/objectinspector/editors/lrcoloreditor.cpp b/src/objectinspector/editors/lrcoloreditor.cpp new file mode 100644 index 0000000..015dde1 --- /dev/null +++ b/src/objectinspector/editors/lrcoloreditor.cpp @@ -0,0 +1,72 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrcoloreditor.h" + +#include +#include + +ColorEditor::ColorEditor(QWidget *parent) : + QWidget(parent) +{ + //m_button = new QPushButton(this); + m_button = new QToolButton(this); + m_button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); + QHBoxLayout* layout = new QHBoxLayout(this); + layout->addWidget(m_button); + layout->setSpacing(0); + layout->setContentsMargins(1,1,1,1); + setFocusProxy(m_button); + setAutoFillBackground(true); + setLayout(layout); + connect(m_button,SIGNAL(clicked()),this,SLOT(slotClicked())); +} + +void ColorEditor::setColor(const QColor &value) +{ + m_color=value; +} + +void ColorEditor::showEvent(QShowEvent *) +{ + QPixmap pixmap(m_button->width()-8,m_button->height()-8); + pixmap.fill(m_color); + m_button->setIcon(QIcon(pixmap)); + m_button->setIconSize(QSize(m_button->width()-8,m_button->height()-8)); +} + +void ColorEditor::slotClicked() +{ + QColorDialog* dialog = new QColorDialog(this); + dialog->setCurrentColor(m_color); + if (dialog->exec()) m_color=dialog->currentColor(); + delete dialog; + emit(editingFinished()); +} + diff --git a/src/objectinspector/editors/lrcoloreditor.h b/src/objectinspector/editors/lrcoloreditor.h new file mode 100644 index 0000000..28856d9 --- /dev/null +++ b/src/objectinspector/editors/lrcoloreditor.h @@ -0,0 +1,56 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRCOLOREDITOR_H +#define LRCOLOREDITOR_H + +#include +#include +#include + +class ColorEditor : public QWidget +{ + Q_OBJECT +public: + explicit ColorEditor(QWidget *parent = 0); + QColor color(){return m_color;} + void setColor(const QColor& value); +protected: + void showEvent(QShowEvent *); +signals: + void editingFinished(); +private slots: + void slotClicked(); +private: + QColor m_color; +// QPushButton* m_button; + QToolButton* m_button; +}; + +#endif // LRCOLOREDITOR_H diff --git a/src/objectinspector/editors/lrcomboboxeditor.cpp b/src/objectinspector/editors/lrcomboboxeditor.cpp new file mode 100644 index 0000000..c0b8464 --- /dev/null +++ b/src/objectinspector/editors/lrcomboboxeditor.cpp @@ -0,0 +1,140 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include "lrcomboboxeditor.h" + +ComboBoxEditor::ComboBoxEditor(QWidget *parent, bool clearable) : + QWidget(parent), + m_comboBox(new InternalComboBox(this)), + m_buttonClear(0), + m_settingValues(false) +{ + setFocusProxy(m_comboBox); + + if (clearable) { + m_buttonClear = new QToolButton(this); + m_buttonClear->setIcon(QIcon(":/items/clear.png")); + m_buttonClear->installEventFilter(this); + m_buttonClear->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Expanding); + m_buttonClear->setMaximumHeight(QWIDGETSIZE_MAX); + connect(m_buttonClear,SIGNAL(clicked()),this,SLOT(slotClearButtonClicked())); + } + + connect(m_comboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotCurrentIndexChanged(QString))); + m_comboBox->installEventFilter(this); + QHBoxLayout *layout = new QHBoxLayout(this); + layout->addWidget(m_comboBox); + if (clearable) + layout->addWidget(m_buttonClear); + layout->setContentsMargins(0,0,0,0); + layout->setSpacing(2); + setLayout(layout); + setAutoFillBackground(true); +} + +void ComboBoxEditor::addItems(const QStringList &values){ + m_settingValues = true; + m_comboBox->addItems(values); + m_settingValues = false; +} + +void ComboBoxEditor::setTextValue(const QString &value){ + m_settingValues = true; + if (m_comboBox->findText(value)>0){ + m_comboBox->setCurrentIndex(m_comboBox->findText(value)); + } else { + m_comboBox->setEditText(value); + } + m_settingValues = false; +} + +void ComboBoxEditor::slotClearButtonClicked(){ + m_comboBox->setCurrentIndex(-1); +} + +void ComboBoxEditor::slotCurrentIndexChanged(const QString& value) +{ + if (!m_settingValues){ + emit currentIndexChanged(value); + } +} + +QString ComboBoxEditor::text(){ + return m_comboBox->currentText(); +} + +void ComboBoxEditor::setEditable(bool value) +{ + if (m_comboBox) { + m_comboBox->setEditable(value); + } +} + +bool ComboBoxEditor::eventFilter(QObject *target, QEvent *event){ + if (target == m_buttonClear){ + if (event->type()==QEvent::FocusOut){ + if (static_cast(event)->reason()!=Qt::MouseFocusReason){ + m_comboBox->setFocus(); + } + } + QSet enterKeys; + enterKeys.insert(Qt::Key_Enter); + enterKeys.insert(Qt::Key_Return); + + if (event->type()==QEvent::KeyPress){ + if (enterKeys.contains(static_cast(event)->key())){ + m_buttonClear->click(); + return true; + } + } + } + + if (target == m_comboBox){ + if (event->type() == QEvent::FocusOut){ + if (!m_comboBox->isPopup() || (m_buttonClear && m_buttonClear->hasFocus())) + emit editingFinished(); + } + } + return QWidget::eventFilter(target,event); +} + + +void ComboBoxEditor::resizeEvent(QResizeEvent *e) +{ + if (m_buttonClear) + m_buttonClear->setMinimumHeight(e->size().height()-4); +} diff --git a/src/objectinspector/editors/lrcomboboxeditor.h b/src/objectinspector/editors/lrcomboboxeditor.h new file mode 100644 index 0000000..ac69c24 --- /dev/null +++ b/src/objectinspector/editors/lrcomboboxeditor.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRCOMBOBOXEDITOR_H +#define LRCOMBOBOXEDITOR_H + +#include +#include +//#include + +class QToolButton; + +class InternalComboBox :public QComboBox{ + Q_OBJECT +public: + InternalComboBox(QWidget* parent=0):QComboBox(parent),m_popup(false){} + void showPopup(){m_popup = true;QComboBox::showPopup();} + void hidePopup(){QComboBox::hidePopup(); m_popup = false;} + bool isPopup(){return m_popup;} +private: + bool m_popup; + +}; + +class ComboBoxEditor : public QWidget +{ + Q_OBJECT +public: + //explicit ComboBoxEditor(QWidget *parent = 0); + ComboBoxEditor(QWidget *parent=0, bool clearable=true); + void addItems(const QStringList& values); + void setTextValue(const QString& value); + QString text(); + void setEditable(bool value); +signals: + void editingFinished(); + void currentIndexChanged(const QString&); +protected: + void resizeEvent(QResizeEvent *e); +private slots: + void slotClearButtonClicked(); + void slotCurrentIndexChanged(const QString& value); +private: + bool eventFilter(QObject *target, QEvent *event); + InternalComboBox* m_comboBox; + QToolButton* m_buttonClear; + bool m_settingValues; +}; + +#endif // LRCOMBOBOXEDITOR_H diff --git a/src/objectinspector/editors/lrfonteditor.cpp b/src/objectinspector/editors/lrfonteditor.cpp new file mode 100644 index 0000000..421be77 --- /dev/null +++ b/src/objectinspector/editors/lrfonteditor.cpp @@ -0,0 +1,81 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrfonteditor.h" +#include +#include +#include + +FontEditor::FontEditor(QWidget *parent) : + QWidget(parent) +{ + //m_button = new QPushButton(this); + m_button = new QToolButton(this); + m_button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); + QHBoxLayout* layout = new QHBoxLayout(this); + layout->addWidget(m_button); + layout->setSpacing(0); + layout->setContentsMargins(1,1,1,1); + setFocusProxy(m_button); + setLayout(layout); + setAutoFillBackground(true); + connect(m_button,SIGNAL(clicked()),this,SLOT(slotButtonCliked())); +} + +FontEditor::~FontEditor() +{} + +void FontEditor::setFontValue(const QFont &font) +{ + m_font=font; + m_button->setText(toString(font)); +} + +QFont FontEditor::fontValue() +{ + return m_font; +} + +void FontEditor::slotButtonCliked() +{ + QFontDialog* dialog = new QFontDialog(this); + dialog->setCurrentFont(m_font); + if (dialog->exec()) m_font=dialog->currentFont(); + delete dialog; + emit(editingFinished()); +} + +QString FontEditor::toString(const QFont &value) const +{ + QString attribs="["; + if (value.bold()) (attribs=="[") ? attribs+="b":attribs+=",b"; + if (value.italic()) (attribs=="[") ? attribs+="i":attribs+=",i"; + attribs+="]"; + return value.family()+" "+QString::number(value.pointSize())+" "+attribs; +} diff --git a/src/objectinspector/editors/lrfonteditor.h b/src/objectinspector/editors/lrfonteditor.h new file mode 100644 index 0000000..703ed91 --- /dev/null +++ b/src/objectinspector/editors/lrfonteditor.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRFONTEDITOR_H +#define LRFONTEDITOR_H + +#include +#include +#include + +class FontEditor : public QWidget +{ + Q_OBJECT +public: + explicit FontEditor(QWidget *parent = 0); + ~FontEditor(); + void setFontValue(const QFont &font); + QFont fontValue(); +signals: + void editingFinished(); +public slots: + void slotButtonCliked(); +private: + QString toString(const QFont& value) const; +private: + //QPushButton* m_button; + QToolButton* m_button; + QFont m_font; +}; + +#endif // LRFONTEDITOR_H diff --git a/src/objectinspector/editors/lrimageeditor.cpp b/src/objectinspector/editors/lrimageeditor.cpp new file mode 100644 index 0000000..42bc2e1 --- /dev/null +++ b/src/objectinspector/editors/lrimageeditor.cpp @@ -0,0 +1,56 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include "lrimageeditor.h" + +ImageEditor::ImageEditor(QWidget* parent) + :QWidget(parent) +{ + m_button.setIcon(QIcon(":items/ImageItem")); + QHBoxLayout* layout = new QHBoxLayout(this); + layout->addWidget(&m_button); + layout->setSpacing(0); + layout->setContentsMargins(1,0,1,1); + setLayout(layout); + setFocusProxy(&m_button); + connect(&m_button,SIGNAL(clicked()),this,SLOT(slotButtonClicked())); +} + +QImage ImageEditor::image() +{ + return m_image; +} + +void ImageEditor::slotButtonClicked() +{ + m_image.load(QFileDialog::getOpenFileName(this)); + emit editingFinished(); +} diff --git a/src/objectinspector/editors/lrimageeditor.h b/src/objectinspector/editors/lrimageeditor.h new file mode 100644 index 0000000..0cd573e --- /dev/null +++ b/src/objectinspector/editors/lrimageeditor.h @@ -0,0 +1,52 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRIMAGEEDITOR_H +#define LRIMAGEEDITOR_H +#include +#include + +class ImageEditor : public QWidget +{ + Q_OBJECT + +public: + ImageEditor(QWidget *parent=0); + QImage image(); + void setImage(const QImage& image){m_image=image;} +signals: + void editingFinished(); +private slots: + void slotButtonClicked(); +private: + QPushButton m_button; + QImage m_image; +}; + +#endif // LRIMAGEEDITOR_H diff --git a/src/objectinspector/editors/lrtextitempropertyeditor.cpp b/src/objectinspector/editors/lrtextitempropertyeditor.cpp new file mode 100644 index 0000000..c27c7f4 --- /dev/null +++ b/src/objectinspector/editors/lrtextitempropertyeditor.cpp @@ -0,0 +1,55 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrtextitempropertyeditor.h" +#include "ui_ltextitempropertyeditor.h" +#include + +TextItemPropertyEditor::TextItemPropertyEditor(QWidget *parent) : + QDialog(parent), + ui(new Ui::TextItemPropertyEditor) +{ + ui->setupUi(this); + ui->textEdit->setAcceptRichText(false); +} + +TextItemPropertyEditor::~TextItemPropertyEditor() +{ + delete ui; +} + +void TextItemPropertyEditor::setText(const QString &value) +{ + ui->textEdit->setPlainText(value); +} + +QString TextItemPropertyEditor::text() +{ + return ui->textEdit->toPlainText(); +} diff --git a/src/objectinspector/editors/lrtextitempropertyeditor.h b/src/objectinspector/editors/lrtextitempropertyeditor.h new file mode 100644 index 0000000..b50c536 --- /dev/null +++ b/src/objectinspector/editors/lrtextitempropertyeditor.h @@ -0,0 +1,56 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef ATEXTITEMPROPERTYEDITOR_H +#define ATEXTITEMPROPERTYEDITOR_H + +#include +#include + +namespace Ui { + class TextItemPropertyEditor; +} + +class TextItemPropertyEditor : public QDialog +{ + Q_OBJECT +public: + explicit TextItemPropertyEditor(QWidget *parent = 0); + ~TextItemPropertyEditor(); + void setText(const QString &value); + QString text(); +public slots: + void pbSaveCliked(){ emit editingFinished();} +signals: + void editingFinished(); +private: + Ui::TextItemPropertyEditor *ui; +}; + +#endif // ATEXTITEMPROPERTYEDITOR_H diff --git a/src/objectinspector/editors/ltextitempropertyeditor.ui b/src/objectinspector/editors/ltextitempropertyeditor.ui new file mode 100644 index 0000000..e31e8be --- /dev/null +++ b/src/objectinspector/editors/ltextitempropertyeditor.ui @@ -0,0 +1,80 @@ + + + TextItemPropertyEditor + + + Qt::WindowModal + + + + 0 + 0 + 400 + 300 + + + + + :/items/images/insert-text_3.png:/items/images/insert-text_3.png + + + true + + + true + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + TextItemPropertyEditor + accept() + + + 54 + 277 + + + 5 + 258 + + + + + buttonBox + rejected() + TextItemPropertyEditor + reject() + + + 161 + 266 + + + 397 + 225 + + + + + + pbSaveCliked() + pbCancelCliked() + + diff --git a/src/objectinspector/images/check.png b/src/objectinspector/images/check.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e2fb323c827d9d570118d1eecea42520e46df9 GIT binary patch literal 447 zcmV;w0YLtVP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipn_ z6$JzGWI|K`00BQqL_t(Y$KBO2N&`U@#_?ZNR8+)9OYs19;sqoi+K8917DPy6A%Y-? zg_VWa>m3v;v9Ry}R@!LPMo_^(Vl#muB%ADJlOhk6ot-!H{xjdcdBdPtA!^t9z~~vM zTyKoz9C!|k_`(B*nhol9N9(x8C$>Z1N8X@ayoMOZky5#VhH-*Qn19jW&jmDwy)ds9 zWRo{&6r~7qkMSm{+!d&R!wB+>r50loK~q?1m6|w>AV1hjSX3ftAAh(Ba>S>52fq>M zDkMZE&_NXF8^zGShWE(#f|)ilCxYg27X_^09FNg=1sfgw&$h`>Y*>B$sfPDitAd#& z>q<>PH9Uock;jhecH0EBn&P~544RJQs!KM}3lMAu-z%0=mZ?;r0xofsq3EVAL6cbM p2Pmt(wYtj72{kUQRWWN|?H^9vakD6EdHw(Z002ovPDHLkV1fhZwoL#4 literal 0 HcmV?d00001 diff --git a/src/objectinspector/images/check_w.png b/src/objectinspector/images/check_w.png new file mode 100644 index 0000000000000000000000000000000000000000..9169b6eb95d72207c620ef3130cbccd34995a807 GIT binary patch literal 576 zcmV-G0>AxPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipn_ z6%8zrZ1n{I00F>BL_t(Y$K95{io!q;#wSMvwXhJ6G+OxpHiB4*c?a#q!pcGfK@bZY zK?G}GLTnTv_yS^SFSfY@ktk7&`(1J8Vl>7?bBzNF`)4x0&E(tJ5WSlT7k&IEL%f^; zyk!Z3@OAEsUItcGl@^Nyg+d`pCX+-&A69;N#YUqMWLZWy97eC#1Af!u{eJ)MrffmYW)nW2 z57}%Mx~}uL0Dx|{3%}pbLAhKGhG9GhYBU-=P%s#Tq9_1>@pz0#B*NFC(J0pIwQZVh zL95jY>2#V0Bq9`xMI;glJ{Cn0!{PAZ_k1V@MNv$@m!R!-i{*0p5=giLd3}|uL?l`LoP6E8exEQ#M4wlTH?kjCh_x O0000sX=v39Ri7HQtC#t$ryqxc!J{!bAX!OfrM}Z)QU}3 zYzhoX)rQ~A%s>D4-kS`p`uBQ!wpkR#5vUgABw-kSJv;aqxlrx*d#&VQ7*I;3z#;$u zmSs(bw{6R2vq32}>Uq~F@~NbhL{T*Bo9tjrLJ02nJ3@%p1B4JrDQTL9?RGospB>Tl zdgXSz0q}S{kWz9!pV{qpS_MsZkftelo&!G*UX~?}<8U|}w8CcrNs`cY9d%uEI-LOU zJP+4(wE?pux?C<~S%ztv0QkPI9S$0gY}+dfS;y7Lu pJ_YzxN>x)o^sj$0dDSXyeFNQ!P$Z2^<7)r_002ovPDHLkV1gQLj|2b! literal 0 HcmV?d00001 diff --git a/src/objectinspector/images/clear.png b/src/objectinspector/images/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc2b446f8c9e06ba58bbb9770c3be391aa1563d GIT binary patch literal 723 zcmV;^0xbQBP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L03_)E03_)FP$cL000007bV*G`2ipS{ z78EZVD*+Jz00L7N-xZ^>P>>mI>pR!%{}L`h26)#= zyX5*z)Z74@bF-^M!_Eg`0BXx5T7RGo4t+Wynbx5O9GePYZF>!=mWnWKG@OhBp#FHm z8|x{9c;B*R-qv3t04}Sl6c*&!RSZ4WxO&(3a^cf1il>LRifUB*|JIR1jU=O*%uyMy zYrE*pcqCFsB1G zaMj9?)4JZQ;Fxfg3BP^6aEs17 zKqkT{3->R-l$cV=&x!6AIeQ0-mW8Ohi3egm^N~Yt_k!efc!^8efIvZ;{DwI-li8^O zrtG%c%f2!Y1tbD%faJ)a-DBBh*}Wv@g~vG#m?d*cku)*bJzaTrr1*NHx8I;32L=An z3MOE+?jRnJ-!|vmOG!^kU-Zo4@+M3++6rIXMw`R2_GnkHYn;=Wr0!JZjU?cQn6e}ov`?612 z^dYEdx-=+=il7P65^_V9OeVGU0#b&Bx{2b4f9E_p8DwYto^!d+{oQ-+bMFKpkA8)P z0zDOiXSX066a+yVXt!Qp;hRI}t-EN21>xJL%$H2e<$p1~Ali!p9}_r;{A=sl;BR{N9k!WLgC nGe5FW-LK2a$}}`wymRbj0}up8IFJMHjM=pV+|OeV6Gq@KUXQL70(Y)*K0-AbW|YuPgg)E?!Yik-JPC^MOLSo-U3d9>?Ea zwdHFt;Apt$|LOtjp8tPs8ap>y-Lxpt&^lsbuyOB)V6MGK3r_R1ALfZ#=h9=X7AL^S z`bFR4-o8I!8k!9&zb?A6z?X6DHDe)#^3A25(PxD{8tyJ$Bs2XWx7KGF?fO6A6>Mp{ adWFyU@(SOUNUH~0%;4$j=d#Wzp$P!4PESby literal 0 HcmV?d00001 diff --git a/src/objectinspector/images/uncheck_w.png b/src/objectinspector/images/uncheck_w.png new file mode 100644 index 0000000000000000000000000000000000000000..838c0ab18039b619d8327fd1a78c60fbe9c820b4 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*x37`TN&n2}-D90{Nxdx@v7EBkFOUQvE6FH56MK%pd07sn8f<8QAW zR2rLgvE2_B5-DIF` N44$rjF6*2Ung9={L;U~% literal 0 HcmV?d00001 diff --git a/src/objectinspector/images/unchecked.png b/src/objectinspector/images/unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..574c0d4d8f9490470bc1bee64ef2d162430a5cc2 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*O%l>?NMQuI#tDc!iC48^bnV1qu~;x;Tb-9Dh4y zr(lBt4~ux4&r0he{(y$=1#B-4vhL`6eM->su(U + + images/clear.png + images/edit_16.ico + images/check.png + images/uncheck.png + images/check_w.png + images/uncheck_w.png + + diff --git a/src/objectinspector/lrbasedesignobjectmodel.cpp b/src/objectinspector/lrbasedesignobjectmodel.cpp new file mode 100644 index 0000000..8f22a97 --- /dev/null +++ b/src/objectinspector/lrbasedesignobjectmodel.cpp @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrbasedesignobjectmodel.h" +#include "lrbasedesignintf.h" + +namespace LimeReport{ + +BaseDesignPropertyModel::BaseDesignPropertyModel(QObject *parent) + : QObjectPropertyModel(parent) +{} + +void BaseDesignPropertyModel::setObject(QObject *object) +{ + BaseDesignIntf* reportItem = dynamic_cast(object); + if (reportItem){ + connect(reportItem,SIGNAL(propertyChanged(QString,QVariant,QVariant)),this,SLOT(slotPropertyChanged(QString,QVariant,QVariant))); + + } + QObjectPropertyModel::setObject(object); +} + +} + + diff --git a/src/objectinspector/lrbasedesignobjectmodel.h b/src/objectinspector/lrbasedesignobjectmodel.h new file mode 100644 index 0000000..518d3a8 --- /dev/null +++ b/src/objectinspector/lrbasedesignobjectmodel.h @@ -0,0 +1,43 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRBASEDESIGNOBJECTSMODEL_H +#define LRBASEDESIGNOBJECTSMODEL_H + +#include "lrobjectitemmodel.h" +#include +namespace LimeReport{ +class BaseDesignPropertyModel : public QObjectPropertyModel +{ +public: + explicit BaseDesignPropertyModel(QObject* parent=0); + virtual void setObject(QObject *object); +}; +} +#endif // LRBASEDESIGNOBJECTSMODEL_H diff --git a/src/objectinspector/lrobjectinspectorwidget.cpp b/src/objectinspector/lrobjectinspectorwidget.cpp new file mode 100644 index 0000000..4405f7d --- /dev/null +++ b/src/objectinspector/lrobjectinspectorwidget.cpp @@ -0,0 +1,158 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include + +#include "lrglobal.h" +#include "lrobjectinspectorwidget.h" +#include "lrobjectitemmodel.h" + +namespace LimeReport{ + +ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) + :QTreeView(parent), m_propertyDelegate(0) +{ + setRootIsDecorated(false); + initColorMap(); + setEditTriggers( + QAbstractItemView::DoubleClicked | + QAbstractItemView::SelectedClicked | + QAbstractItemView::EditKeyPressed + ); + m_propertyDelegate = new PropertyDelegate(this); + setItemDelegate(m_propertyDelegate); + QPalette p = palette(); + p.setColor(QPalette::AlternateBase,QColor(229,255,214)); + setPalette(p); +} + +ObjectInspectorWidget::~ObjectInspectorWidget(){} + +void ObjectInspectorWidget::drawRow(QPainter *painter, const QStyleOptionViewItem &options, const QModelIndex &index) const +{ + ObjectPropItem *node = nodeFromIndex(index); + QStyleOptionViewItemV4 so = options; + bool alternate = so.features & QStyleOptionViewItemV4::Alternate; + if (node){ + if ((!node->isHaveValue())){ + const QColor c = options.palette.color(QPalette::Dark); + painter->fillRect(options.rect,c); + so.palette.setColor(QPalette::AlternateBase,c); + } else { + if ( index.isValid()&&(nodeFromIndex(index)->colorIndex()!=-1) ){ + QColor fillColor(getColor(nodeFromIndex(index)->colorIndex()%m_colors.count())); + so.palette.setColor(QPalette::AlternateBase,fillColor.lighter(115)); + if (!alternate){ + painter->fillRect(options.rect,fillColor); + } + } + } + } + QTreeView::drawRow(painter,so,index); + painter->save(); + QColor gridLineColor = static_cast(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor,&so)); + painter->setPen(gridLineColor); + painter->drawLine(so.rect.x(),so.rect.bottom(),so.rect.right(),so.rect.bottom()); + painter->restore(); +} + +void ObjectInspectorWidget::mousePressEvent(QMouseEvent *event) +{ + + if ((event->button()==Qt::LeftButton)){ + QModelIndex index=indexAt(event->pos()); + if (index.isValid()){ + if (event->pos().x()isHaveValue()) + setExpanded(index,!isExpanded(index)); + } else { + if ((index.column()==1)&&(!nodeFromIndex(index)->isHaveChildren())) { + setCurrentIndex(index); + edit(index); + return ; + } + } + } + } + + QTreeView::mousePressEvent(event); +} + +void ObjectInspectorWidget::initColorMap() +{ + m_colors.reserve(6); + m_colors.push_back(QColor(255,230,191)); + m_colors.push_back(QColor(255,255,191)); + m_colors.push_back(QColor(191,255,191)); + m_colors.push_back(QColor(199,255,255)); + m_colors.push_back(QColor(234,191,255)); + m_colors.push_back(QColor(255,191,239)); +} + +QColor ObjectInspectorWidget::getColor(const int index) const +{ + return m_colors[index]; +} + +void ObjectInspectorWidget::reset() +{ + QTreeView::reset(); + for (int i=0;irowCount();i++){ + if (!nodeFromIndex(model()->index(i,0))->isHaveValue()){ + setFirstColumnSpanned(i,model()->index(i,0).parent(),true); + } + } +} + +ObjectPropItem * ObjectInspectorWidget::nodeFromIndex(QModelIndex index) const +{ + return static_cast(index.internalPointer()); +} + +void ObjectInspectorWidget::keyPressEvent(QKeyEvent *event) +{ + if (event->key()==Qt::Key_Return){ + if(!m_propertyDelegate->isEditing()){ + QModelIndex index = currentIndex().model()->index(currentIndex().row(), + 1,currentIndex().parent()); + edit(index); + event->accept(); + } + } else QTreeView::keyPressEvent(event); +} + +void ObjectInspectorWidget::commitActiveEditorData(){ + if (state()==QAbstractItemView::EditingState){ + commitData(indexWidget(currentIndex())); + } +} + +} //namespace LimeReport diff --git a/src/objectinspector/lrobjectinspectorwidget.h b/src/objectinspector/lrobjectinspectorwidget.h new file mode 100644 index 0000000..d6e4495 --- /dev/null +++ b/src/objectinspector/lrobjectinspectorwidget.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LROBJECTINSPECTORWIDGET_H +#define LROBJECTINSPECTORWIDGET_H + +#include +#include +#include "lrobjectitemmodel.h" +#include "lrpropertydelegate.h" + +namespace LimeReport{ + +class ObjectInspectorWidget : public QTreeView +{ + Q_OBJECT +public: + ObjectInspectorWidget(QWidget * parent=0); + ~ObjectInspectorWidget(); + QColor getColor(const int index) const; + virtual void reset(); + virtual void commitActiveEditorData(); +protected: + void mousePressEvent(QMouseEvent *event); + void drawRow(QPainter *painter, const QStyleOptionViewItem &options, const QModelIndex &index) const; + void keyPressEvent(QKeyEvent *event); +private: + void initColorMap(); + LimeReport::ObjectPropItem* nodeFromIndex(QModelIndex index) const; + +private: + QVector m_colors; + PropertyDelegate *m_propertyDelegate; +}; + +} //namespace LimeReport + +#endif // LROBJECTINSPECTORWIDGET_H diff --git a/src/objectinspector/lrobjectitemmodel.cpp b/src/objectinspector/lrobjectitemmodel.cpp new file mode 100644 index 0000000..7b837b8 --- /dev/null +++ b/src/objectinspector/lrobjectitemmodel.cpp @@ -0,0 +1,357 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrobjectitemmodel.h" +#include +#include +#include +#include + +namespace LimeReport { + +QObjectPropertyModel::QObjectPropertyModel(QObject *parent/*=0*/) + :QAbstractItemModel(parent),m_rootNode(0),m_object(0),m_dataChanging(false), m_subclassesAsLevel(true), m_validator(0) +{} + +QObjectPropertyModel::~QObjectPropertyModel() +{ + if (m_rootNode) + delete m_rootNode; +} + +void QObjectPropertyModel::initModel() +{ + beginResetModel(); + delete m_rootNode; + m_rootNode=0; + if (m_object) { + connect(m_object,SIGNAL(destroyed(QObject*)),this,SLOT(slotObjectDestroyed(QObject*))); + m_rootNode=new ObjectPropItem(0,0,"root","root",QVariant(),0); + m_rootNode->setModel(this); + foreach(QObject* item, m_objects) + connect(item,SIGNAL(destroyed(QObject*)),this,SLOT(slotObjectDestroyed(QObject*))); + addObjectProperties(m_object->metaObject(), m_object, &m_objects); + } + //reset(); + endResetModel(); +} + +void QObjectPropertyModel::setObject(QObject *object) +{ + m_objects.clear(); + if (m_object!=object){ + submit(); + m_object=object; + initModel(); + } +} + +void QObjectPropertyModel::setMultiObjects(QList* list) +{ + m_objects.clear(); + submit(); + if (m_object!=list->at(0)){ + m_object=list->at(0); + list->removeAt(0); + foreach(QObject* item, *list) + m_objects.append(item); + initModel(); + } + +} + +void QObjectPropertyModel::slotObjectDestroyed(QObject *obj) +{ + m_objects.removeOne(obj); + if (m_object == obj){ + m_object=0; + if (!m_objects.isEmpty()) m_object=m_objects.at(0); + initModel(); + } +} + +void QObjectPropertyModel::slotPropertyChanged(const QString &propertyName, const QVariant& oldValue, const QVariant& newValue) +{ + Q_UNUSED(oldValue); + Q_UNUSED(newValue); + if (m_object) + updateProperty(propertyName); +} + +void QObjectPropertyModel::slotPropertyObjectNameChanged(const QString &oldName, const QString &newName) +{ + Q_UNUSED(oldName) + Q_UNUSED(newName) + if (m_object) + updateProperty("objectName"); +} + + +int QObjectPropertyModel::columnCount(const QModelIndex &/*parent*/) const +{ + return 2; +} + +QVariant QObjectPropertyModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if(orientation==Qt::Horizontal&&role==Qt::DisplayRole){ + if (section==0) return tr("Property Name"); + else return tr("Property value"); + } else return QVariant(); +} + +ObjectPropItem * QObjectPropertyModel::nodeFromIndex(const QModelIndex &index) const +{ + if(index.isValid()){ + return static_cast(index.internalPointer()); + } else return m_rootNode; +} + +void QObjectPropertyModel::updateProperty(const QString &propertyName) +{ + if (!m_dataChanging&&m_rootNode){ + ObjectPropItem* propItem = m_rootNode->findPropertyItem(propertyName); + if (propItem) + propItem->updatePropertyValue(); + } +} + +void QObjectPropertyModel::setSubclassesAsLevel(bool value) +{ + m_subclassesAsLevel = value; +} + +int QObjectPropertyModel::rowCount(const QModelIndex &parent) const +{ + if (!m_rootNode) return 0; + ObjectPropItem *parentNode; + if (parent.isValid()) + parentNode = nodeFromIndex(parent); + else + parentNode = m_rootNode; + return parentNode->childCount(); +} + +QVariant QObjectPropertyModel::data(const QModelIndex &index, int role) const +{ + ObjectPropItem *node = nodeFromIndex(index); + switch (role) { + case Qt::DisplayRole: + if (!node) return QVariant(); + if (index.column()==0){ + return node->displayName(); + } else return node->displayValue(); + break; + case Qt::DecorationRole : + if (!node) return QIcon(); + if (index.column()==1){ + return node->iconValue(); + }else return QIcon(); + break; + default: + return QVariant(); + } +} + +QModelIndex QObjectPropertyModel::index(int row, int column, const QModelIndex &parent) const +{ + if(!m_rootNode) + return QModelIndex(); + + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + ObjectPropItem *parentNode; + if (parent.isValid()) + parentNode = nodeFromIndex(parent); + else + parentNode = m_rootNode; + + ObjectPropItem *childItem=parentNode->child(row); + + if (childItem){ + QModelIndex modelIndex=createIndex(row,column,childItem); + if (column==1){ + if (childItem->modelIndex()!=modelIndex){ + childItem->setModelIndex(modelIndex); + } + } + return modelIndex; + } + else return QModelIndex(); +} + +QModelIndex QObjectPropertyModel::parent(const QModelIndex &child) const +{ + if (!child.isValid()) return QModelIndex(); + + ObjectPropItem *childNode = nodeFromIndex(child); + if (!childNode) return QModelIndex(); + + ObjectPropItem *parentNode = childNode->parent(); + if ((parentNode == m_rootNode) || (!parentNode)) return QModelIndex(); + + return createIndex(parentNode->row(),0,parentNode); +} + + +Qt::ItemFlags QObjectPropertyModel::flags(const QModelIndex &index) const +{ + if ((index.column()==1)&&(!nodeFromIndex(index)->isValueReadonly())) return Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable; + else return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + +CreatePropItem QObjectPropertyModel::propertyItemCreator(QMetaProperty prop) +{ + CreatePropItem creator=0; + creator=ObjectPropFactory::instance().objectCreator(APropIdent(prop.name(),prop.enclosingMetaObject()->className())); + if (!creator){ + if (prop.isFlagType()){ + creator=ObjectPropFactory::instance().objectCreator(APropIdent("flags","")); + if (creator){ + return creator; + } else { + qDebug()<<"flags prop editor not found"; + return 0; + } + } + if (prop.isEnumType()){ + creator=ObjectPropFactory::instance().objectCreator(APropIdent("enum","")); + if (creator){ + return creator; + } else { + qDebug()<<"enum prop editor not found"; + return 0; + } + } + creator=ObjectPropFactory::instance().objectCreator(APropIdent(prop.typeName(),"")); + if (!creator) {qDebug()<<"Editor for propperty name = \""<property(prop.name()), + parent, + !(prop.isWritable()&&prop.isDesignable()) + ); + } else { + propertyItem=new ObjectPropItem( + 0, + 0, + QString(prop.name()), + QString(prop.name()), + object->property(prop.name()), + parent + ); + } + return propertyItem; +} +ValidatorIntf *QObjectPropertyModel::validator() const +{ + return m_validator; +} + +void QObjectPropertyModel::setValidator(ValidatorIntf *validator) +{ + m_validator = validator; +} + + +void QObjectPropertyModel::addObjectProperties(const QMetaObject *metaObject, QObject *object, ObjectPropItem::ObjectsList *objects, int level) +{ + if (metaObject->propertyCount()>metaObject->propertyOffset()){ + ObjectPropItem* objectNode; + if (m_subclassesAsLevel){ + objectNode=new ObjectPropItem(0,0,metaObject->className(),metaObject->className(),m_rootNode,true); + m_rootNode->appendItem(objectNode); + } else { + objectNode = m_rootNode; + } + + //m_rootNode->appendItem(objectNode); + + for (int i=metaObject->propertyOffset();ipropertyCount();i++){ + if (metaObject->property(i).isDesignable()){ + ObjectPropItem* prop=createPropertyItem(metaObject->property(i),object,objects,objectNode); + //ObjectPropItem* prop=createPropertyItem(metaObject->property(i),object,objects,m_rootNode); + //m_rootNode->appendItem(prop); + objectNode->appendItem(prop); + } + } + if (m_subclassesAsLevel){ + objectNode->setColorIndex(level); + objectNode->sortItem(); + level++; + } + } + + if (metaObject->superClass()) addObjectProperties(metaObject->superClass(),object,objects,level); + m_rootNode->sortItem(); +} + +bool QObjectPropertyModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (index.isValid()&&role==Qt::EditRole){ + m_dataChanging=true; + ObjectPropItem * propItem = nodeFromIndex(index); + if (propItem->propertyValue()!=value){ + QString msg; + if (validator() && !validator()->validate(propItem->propertyName(),value.toString(),m_object,msg)){ + QMessageBox::information(0,tr("Warning"),msg); + return true; + } + QVariant oldValue=propItem->propertyValue(); + propItem->setPropertyValue(value); + emit dataChanged(index,index); + emit objectPropetyChanged(propItem->propertyName(),oldValue,propItem->propertyValue()); + } + m_dataChanging=false; + return true; + } + return false; +} + +void QObjectPropertyModel::itemDataChanged(const QModelIndex &index) +{ + emit dataChanged(index,index); +} + +} + diff --git a/src/objectinspector/lrobjectitemmodel.h b/src/objectinspector/lrobjectitemmodel.h new file mode 100644 index 0000000..b354538 --- /dev/null +++ b/src/objectinspector/lrobjectitemmodel.h @@ -0,0 +1,94 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LROBJECTITEMMODEL_H +#define LROBJECTITEMMODEL_H + +#include +#include +#include +#include "lrobjectpropitem.h" + +namespace LimeReport{ + + +class ValidatorIntf { +public: + virtual bool validate(const QString& propName, const QVariant& propValue, QObject* object, QString& msg) = 0; + virtual ~ValidatorIntf(){} +}; + +class QObjectPropertyModel : public QAbstractItemModel +{ + Q_OBJECT +public: + QObjectPropertyModel(QObject *parent=0); + ~QObjectPropertyModel(); + virtual void setObject(QObject *object); + virtual void setMultiObjects(QList* list); + virtual QModelIndex index(int row, int column, const QModelIndex &parent) const; + virtual QModelIndex parent(const QModelIndex &child) const; + virtual int columnCount(const QModelIndex &parent) const; + virtual int rowCount(const QModelIndex &parent) const; + virtual QVariant data(const QModelIndex &index, int role) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role); + void itemDataChanged(const QModelIndex &index); + void initModel(); + const QObject* currentObject(){return m_object;} + LimeReport::ObjectPropItem* nodeFromIndex(const QModelIndex &index) const; + LimeReport::ObjectPropItem* rootNode(){return m_rootNode;} + void updateProperty(const QString& propertyName); + void setSubclassesAsLevel(bool value); + bool subclassesAsLevel(){return m_subclassesAsLevel;} + ValidatorIntf* validator() const; + void setValidator(ValidatorIntf* validator); + +signals: + void objectPropetyChanged(const QString& , const QVariant&, const QVariant&); +private slots: + void slotObjectDestroyed(QObject* obj); + void slotPropertyChanged(const QString& propertyName, const QVariant &oldValue, const QVariant &newValue); + void slotPropertyObjectNameChanged(const QString& oldName, const QString& newName); +private: + void addObjectProperties(const QMetaObject *metaObject, QObject *object, ObjectPropItem::ObjectsList* objects, int level=0); + LimeReport::CreatePropItem propertyItemCreator(QMetaProperty prop); + LimeReport::ObjectPropItem* createPropertyItem(QMetaProperty prop, QObject *object, ObjectPropItem::ObjectsList* objects, ObjectPropItem* parent); +private: + LimeReport::ObjectPropItem* m_rootNode; + QObject* m_object; + QList m_objects; + bool m_dataChanging; + bool m_subclassesAsLevel; + ValidatorIntf* m_validator; +}; + +} +#endif // LROBJECTITEMMODEL_H diff --git a/src/objectinspector/lrobjectpropitem.cpp b/src/objectinspector/lrobjectpropitem.cpp new file mode 100644 index 0000000..a13751d --- /dev/null +++ b/src/objectinspector/lrobjectpropitem.cpp @@ -0,0 +1,181 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrobjectpropitem.h" +#include "lrobjectitemmodel.h" +#ifdef INSPECT_BASEDESIGN +#include "lrbasedesignintf.h" +#endif +#include + +namespace LimeReport { + +bool lesThen(ObjectPropItem* v1, ObjectPropItem* v2){ + return v1->displayName().compare(v2->displayName())<0; +} + +ObjectPropItem::ObjectPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, ObjectPropItem *parent, bool isClass) + :m_object(object), m_name(name), m_displayName(displayName), m_haveValue(false), m_parent(parent), m_colorIndex(-1), + m_readonly(true), m_model(0), m_isClass(isClass), m_changingValue(false) +{ + if (parent) setModel(parent->model()); + m_index=QModelIndex(); + if (objects) foreach(QObject* item, *objects) m_objects.append(item); +#ifdef INSPECT_BASEDESIGN + BaseDesignIntf * item = dynamic_cast(object); + if (item){ + connect(item,SIGNAL(propertyChanged(QString,QVariant,QVariant)),this,SLOT(slotPropertyChanged(QString,QVariant,QVariant))); + connect(item,SIGNAL(propertyObjectNameChanged(QString,QString)),this,SLOT(slotPropertyObjectName(QString,QString))); + } +#endif +} + +ObjectPropItem::ObjectPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly) + :m_object(object), m_name(name), m_displayName(displayName), m_value(value), + m_haveValue(true), m_parent(parent), m_colorIndex(-1), + m_readonly(readonly), m_model(0), m_isClass(false), m_changingValue(false) +{ + if (parent) setModel(parent->model()); + m_index=QModelIndex(); + if (objects) foreach(QObject* item, *objects) m_objects.append(item); +#ifdef INSPECT_BASEDESIGN + BaseDesignIntf * item = dynamic_cast(object); + if (item){ + connect(item,SIGNAL(propertyChanged(QString,QVariant,QVariant)),this,SLOT(slotPropertyChanged(QString,QVariant,QVariant))); + connect(item,SIGNAL(propertyObjectNameChanged(QString,QString)),this,SLOT(slotPropertyObjectName(QString,QString))); + } +#endif +} + +ObjectPropItem::~ObjectPropItem(){ + qDeleteAll(m_childItems); +} + + +int ObjectPropItem::childCount(){ + return m_childItems.count(); +} + +void ObjectPropItem::appendItem(ObjectPropItem *item){ + m_childItems.append(item); + if (m_parent && (!item->isClass())) m_parent->m_globalPropList.append(item); +} + +void ObjectPropItem::sortItem() +{ + qSort(m_childItems.begin(), m_childItems.end(), lesThen); +} + +QVariant ObjectPropItem::propertyValue() const { + return m_value; +} + +void ObjectPropItem::setPropertyValue(QVariant value){ + m_value=value; + LimeReport::QObjectPropertyModel *itemModel=dynamic_cast(model()); + if (itemModel){ + itemModel->itemDataChanged(modelIndex()); + foreach(ObjectPropItem*item, children()){ + if (item->modelIndex().isValid()) itemModel->itemDataChanged(item->modelIndex()); + } + } +} + +int ObjectPropItem::row(){ + if (m_parent) + return m_parent->m_childItems.indexOf(const_cast(this)); + return 0; +} + +ObjectPropItem * ObjectPropItem::child(int row){ + return m_childItems[row]; +} + +void ObjectPropItem::setColorIndex(int value) +{ + m_colorIndex=value; + for (int i=0;isetColorIndex(value); + } +} + +#ifdef INSPECT_BASEDESIGN +void ObjectPropItem::slotPropertyChanged(const QString &name, QVariant, QVariant newValue) +{ + if (name.compare(propertyName(),Qt::CaseInsensitive)==0 && !isValueChanging()){ + setPropertyValue(newValue); + } +} + +void ObjectPropItem::slotPropertyObjectName(const QString &oldValue, const QString &newValue) +{ + Q_UNUSED(oldValue) + if (propertyName().compare("objectName",Qt::CaseInsensitive)==0 && !isValueChanging()){ + setPropertyValue(newValue); + } +} +#endif + +ObjectPropItem * ObjectPropItem::findChild(const QString &name) +{ + foreach(ObjectPropItem* item,m_childItems){ + if (item->propertyName()==name) return item; + } + return 0; +} + +ObjectPropItem *ObjectPropItem::findPropertyItem(const QString &propertyName) +{ + foreach(ObjectPropItem* item,m_globalPropList){ + if (item->propertyName()==propertyName) return item; + } + return 0; +} + +void ObjectPropItem::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const +{ + editor->setGeometry(option.rect); +} + +void ObjectPropItem::updatePropertyValue() +{ + m_model->setData(m_index,m_object->property(m_name.toLatin1())); +} + +bool ObjectPropItem::paint(QPainter *, const QStyleOptionViewItemV4 &, const QModelIndex &) +{ + return false; +} + +QString ObjectPropItem::displayValue() const +{ + return m_value.toString(); +} + +} diff --git a/src/objectinspector/lrobjectpropitem.h b/src/objectinspector/lrobjectpropitem.h new file mode 100644 index 0000000..b70976a --- /dev/null +++ b/src/objectinspector/lrobjectpropitem.h @@ -0,0 +1,139 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LROBJECTPROPITEM_H +#define LROBJECTPROPITEM_H + +#include +#include +#include +#include +#include +#include +#include + +#include "lrattribsabstractfactory.h" +#include "lrsingleton.h" + +namespace LimeReport{ + + class ObjectPropItem : public QObject + { + Q_OBJECT + + public: + typedef QList< QObject* > ObjectsList; + ObjectPropItem(){invalidate();} + ObjectPropItem(QObject *object, ObjectsList* objects, const QString& propertyName, const QString& displayName, const QVariant& propertyValue, ObjectPropItem* parent, bool readonly=true); + ObjectPropItem(QObject *object, ObjectsList* objects, const QString& propertyName, const QString& displayName, ObjectPropItem *parent, bool isClass = false); + ~ObjectPropItem(); + + virtual QVariant propertyValue() const; + virtual void setPropertyValue(QVariant value); + virtual QString propertyName() const {return m_name;} + virtual QString displayName() const {return m_displayName;} + virtual QString displayValue() const; + virtual QIcon iconValue() const{return QIcon();} + virtual bool isHaveChildren() const {return m_childItems.count()>0;} + virtual bool isHaveValue() const {return m_haveValue;} + virtual bool isValueReadonly() const {return m_readonly;} + void setValueReadOnly(bool value){m_readonly=value;} + virtual bool isValueModified() const {return false;} + virtual QWidget* createProperyEditor(QWidget * /*parent*/) const {return 0;} + virtual void setPropertyEditorData(QWidget *, const QModelIndex &) const{} + virtual void setModelData(QWidget * /*editor*/, QAbstractItemModel * /*model*/, const QModelIndex &/*index*/){} + virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const; + virtual void updatePropertyValue(); + virtual bool paint(QPainter *, const QStyleOptionViewItemV4 &, const QModelIndex &); + + ObjectPropItem* parent() const{ return m_parent;} + QObject* object() const{return m_object;} + ObjectsList* objects() {return &m_objects;} + ObjectPropItem* child(int row); + QList children(){return m_childItems;} + ObjectPropItem* findChild(const QString& propertyName); + ObjectPropItem* findPropertyItem(const QString& propertyName); + int childCount(); + void appendItem(ObjectPropItem* item); + void sortItem(); + int row(); + bool isValid(){return m_valid;} + int colorIndex(){return m_colorIndex;} + void setColorIndex(int propertyValue); + void setModel(QAbstractItemModel* model){m_model=model;} + QAbstractItemModel* model(){return m_model;} + void setModelIndex(QModelIndex index){m_index=index;} + QModelIndex modelIndex(){return m_index;} + bool isClass(){return m_isClass;} +#ifdef INSPECT_BASEDESIGN + private slots: + void slotPropertyChanged(const QString& name, QVariant, QVariant newValue); + void slotPropertyObjectName(const QString& oldValue, const QString& newValue); +#endif + private: + bool m_valid; + void invalidate(){m_object=0; m_valid = false; m_name = ""; m_value=QVariant(), m_isClass=false;} + protected: + void beginChangeValue(){ m_changingValue = true; } + void endChangeValue(){ m_changingValue = false; } + bool isValueChanging(){ return m_changingValue; } + private: + QObject* m_object; + ObjectsList m_objects; + QString m_name; + QString m_displayName; + QVariant m_value; + bool m_haveValue; + ObjectPropItem* m_parent; + QList m_childItems; + QList m_globalPropList; + int m_colorIndex; + bool m_readonly; + QAbstractItemModel* m_model; + QModelIndex m_index; + bool m_isClass; + bool m_changingValue; + }; + + typedef QPair APropIdent; + typedef ObjectPropItem* (*CreatePropItem)(QObject *object, ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly); + + class ObjectPropFactory : public AttribsAbstractFactory + { + private: + friend class Singleton; + private: + ObjectPropFactory(){} + ~ObjectPropFactory(){} + ObjectPropFactory(const ObjectPropFactory&){} + ObjectPropFactory& operator = (const ObjectPropFactory&){return *this;} + }; + +} +#endif // LROBJECTPROPITEM_H diff --git a/src/objectinspector/lrpropertydelegate.cpp b/src/objectinspector/lrpropertydelegate.cpp new file mode 100644 index 0000000..4796c23 --- /dev/null +++ b/src/objectinspector/lrpropertydelegate.cpp @@ -0,0 +1,165 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrpropertydelegate.h" +#include "lrobjectitemmodel.h" +#include "lrobjectinspectorwidget.h" +#include +#include +#include +#include "lrglobal.h" + +LimeReport::PropertyDelegate::PropertyDelegate(QObject *parent) + :QItemDelegate(parent), m_editingItem(0), m_isEditing(false) + //:QStyledItemDelegate(parent), m_editingItem(0) +{ + //setClipping(false); +} + +void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (!index.isValid()) return; + + LimeReport::ObjectPropItem *node = static_cast(index.internalPointer()); + if (node){ + if (!node->isHaveValue()){ + if (index.column()==0) { + QStyleOptionViewItemV4 cellOpt = option; + QTreeView const *tree = dynamic_cast(cellOpt.widget); + QStyleOptionViewItem primitiveOpt = cellOpt; + primitiveOpt.rect.setWidth(tree->indentation()); + painter->save(); + painter->setPen(option.palette.color(QPalette::HighlightedText)); + painter->setBackground(QBrush(option.palette.color(QPalette::Highlight))); + drawBackground(painter,option,index); + cellOpt.widget->style()->drawPrimitive(QStyle::PE_IndicatorBranch,&primitiveOpt,painter); + cellOpt.rect.adjust(primitiveOpt.rect.width(),0,0,0); + cellOpt.font.setBold(true); + cellOpt.palette.setColor(QPalette::Text,cellOpt.palette.color(QPalette::BrightText)); + drawDisplay(painter,cellOpt,cellOpt.rect,LimeReport::extractClassName(node->propertyName())); + painter->restore(); + } + } else + { + if (index.column()==0){ + QPointF start( + option.rect.x()+option.rect.width()-1, + option.rect.y() + ); + QPointF end( + option.rect.x()+option.rect.width()-1, + option.rect.y()+option.rect.height() + ); + painter->save(); + painter->setPen(option.palette.color(QPalette::Dark)); + painter->drawLine(start,end); + painter->restore(); + } + + QStyleOptionViewItemV4 so = option; + if ((node->isValueReadonly())&&(!node->isHaveChildren())) { + so.palette.setColor(QPalette::Text,so.palette.color(QPalette::Dark)); + } + drawBackground(painter,option,index); + if (!node->paint(painter,so,index)) + QItemDelegate::paint(painter, so, index); + } + } +} + +QSize LimeReport::PropertyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const +{ + QSize size=option.rect.size(); + size.setHeight(option.fontMetrics.height()+ + QApplication::style()->pixelMetric(QStyle::PM_ButtonMargin) +#ifdef Q_OS_MAC + +QApplication::style()->pixelMetric(QStyle::PM_FocusFrameVMargin) +#endif + +2); + return size; +} + +QWidget * LimeReport::PropertyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + m_editingItem=static_cast(index.internalPointer()); + connect(m_editingItem,SIGNAL(destroyed(QObject*)), this, SLOT(slotItemDeleted(QObject*))); + QWidget *editor=m_editingItem->createProperyEditor(parent); + if (editor){ + m_isEditing = true; + editor->setMaximumHeight(option.rect.height()-1); + editor->setGeometry(option.rect); + if (editor->metaObject()->indexOfSignal("editingFinished()")!=-1) + connect(editor,SIGNAL(editingFinished()),this,SLOT(commitAndCloseEditor())); + connect(editor,SIGNAL(destroyed()),this,SLOT(slotEditorDeleted())); + } + return editor; +} + +void LimeReport::PropertyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + if (m_editingItem) m_editingItem->setPropertyEditorData(editor,index); +} + +void LimeReport::PropertyDelegate::commitAndCloseEditor() +{ + QWidget *editor = qobject_cast(sender()); + emit commitData(editor); + emit closeEditor(editor); +} + +void LimeReport::PropertyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +{ + if (m_editingItem) m_editingItem->setModelData(editor,model,index); +} + +void LimeReport::PropertyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (m_editingItem) m_editingItem->updateEditorGeometry(editor,option,index); +} + +void LimeReport::PropertyDelegate::setObjectInspector(ObjectInspectorWidget* objectInspector) +{ + m_objectInspector=objectInspector; +} + +void LimeReport::PropertyDelegate::slotEditorDeleted() +{ + m_isEditing=false; +} + +void LimeReport::PropertyDelegate::slotItemDeleted(QObject *item) +{ + if (item == m_editingItem) m_editingItem = 0; +} + +LimeReport::ObjectPropItem* LimeReport::PropertyDelegate::editingItem() +{ + return m_editingItem; +} + diff --git a/src/objectinspector/lrpropertydelegate.h b/src/objectinspector/lrpropertydelegate.h new file mode 100644 index 0000000..f7e2414 --- /dev/null +++ b/src/objectinspector/lrpropertydelegate.h @@ -0,0 +1,68 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRPROPERTYDELEGATE_H +#define LRPROPERTYDELEGATE_H + +#include +#include +#include +#include + +#include "lrobjectitemmodel.h" + +namespace LimeReport{ + +class ObjectInspectorWidget; +class PropertyDelegate : public QItemDelegate +//class PropertyDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + PropertyDelegate(QObject *parent=0); + void setObjectInspector(ObjectInspectorWidget* objectInspector); + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; + LimeReport::ObjectPropItem* editingItem(); + bool isEditing(){return m_isEditing;} +private slots: + void commitAndCloseEditor(); + void slotEditorDeleted(); + void slotItemDeleted(QObject* item); +private: + LimeReport::ObjectInspectorWidget* m_objectInspector; + mutable LimeReport::ObjectPropItem* m_editingItem; + mutable bool m_isEditing; +}; +} +#endif // LRPROPERTYDELEGATE_H diff --git a/src/objectinspector/propertyItems/lrboolpropitem.cpp b/src/objectinspector/propertyItems/lrboolpropitem.cpp new file mode 100644 index 0000000..7c7f167 --- /dev/null +++ b/src/objectinspector/propertyItems/lrboolpropitem.cpp @@ -0,0 +1,92 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrboolpropitem.h" +#include "lrobjectpropitem.h" +#include +#include +#include +#include + +#include "../editors/lrcheckboxeditor.h" + +namespace{ + LimeReport::ObjectPropItem * createBoolPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::BoolPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registred = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("bool",""),QObject::tr("bool"),createBoolPropItem); +} // namespace + +namespace LimeReport { + +QWidget *BoolPropItem::createProperyEditor(QWidget *parent) const +{ + CheckBoxEditor *editor= new CheckBoxEditor(parent); + return editor; +} + +void BoolPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + CheckBoxEditor *editor =qobject_cast(propertyEditor); + editor->setEditing(true); + editor->setChecked(propertyValue().toBool()); + editor->setEditing(false); +} + +void BoolPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->isChecked()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +bool BoolPropItem::paint(QPainter *painter, const QStyleOptionViewItemV4 &option, const QModelIndex &index) +{ + if (index.column()==1){ + QStyleOptionButton so; + int border = (option.rect.height() - QApplication::style()->pixelMetric(QStyle::PM_IndicatorWidth))/2; + so.rect = option.rect.adjusted(border,border,0,-border); + so.rect.setWidth(QApplication::style()->pixelMetric(QStyle::PM_IndicatorWidth)); + + if (!isValueReadonly()) + so.state = QStyle::State_Enabled; + else + so.state &= ~QStyle::State_Enabled; + + so.state |= propertyValue().toBool() ? QStyle::State_On : QStyle::State_Off; + + option.widget->style()->drawPrimitive(QStyle::PE_IndicatorCheckBox,&so,painter); + + return true; + } else return false; +} + +} // namespace LimeReport + diff --git a/src/objectinspector/propertyItems/lrboolpropitem.h b/src/objectinspector/propertyItems/lrboolpropitem.h new file mode 100644 index 0000000..0e7dc99 --- /dev/null +++ b/src/objectinspector/propertyItems/lrboolpropitem.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRBOOLPROPITEM_H +#define LRBOOLPROPITEM_H + +#include "lrobjectpropitem.h" + +namespace LimeReport { +class BoolPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + BoolPropItem():ObjectPropItem(){} + BoolPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + virtual QString displayValue() const {return "";} + virtual QWidget* createProperyEditor(QWidget *parent) const; + virtual void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex &) const; + virtual void setModelData(QWidget * propertyEditor, QAbstractItemModel * model, const QModelIndex & index); + bool paint(QPainter *painter, const QStyleOptionViewItemV4 &option, const QModelIndex &index); +}; +} // namespace LimeReport + +#endif // LRBOOLPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrcolorpropitem.cpp b/src/objectinspector/propertyItems/lrcolorpropitem.cpp new file mode 100644 index 0000000..5532e4f --- /dev/null +++ b/src/objectinspector/propertyItems/lrcolorpropitem.cpp @@ -0,0 +1,76 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrcolorpropitem.h" +#include "editors/lrcoloreditor.h" +#include + +namespace{ + LimeReport::ObjectPropItem * createColorPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::ColorPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registredColorProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QColor",""),QObject::tr("QColor"),createColorPropItem); +} + +namespace LimeReport{ + +void ColorPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + ColorEditor *editor =qobject_cast(propertyEditor); + editor->setColor(propertyValue().value()); +} + +void ColorPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->color()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +bool ColorPropItem::paint(QPainter *painter, const QStyleOptionViewItemV4 &option, const QModelIndex &index) +{ + if (index.column()==1){ + painter->save(); + painter->setBrush(propertyValue().value()); + painter->setPen(Qt::gray); + QRect rect = option.rect.adjusted(4,4,-4,-6); + rect.setWidth(rect.height()); + painter->drawRect(rect); + painter->restore(); + return true; + } else return false; +} + +QWidget *ColorPropItem::createProperyEditor(QWidget *parent) const +{ + return new ColorEditor(parent); +} + +} diff --git a/src/objectinspector/propertyItems/lrcolorpropitem.h b/src/objectinspector/propertyItems/lrcolorpropitem.h new file mode 100644 index 0000000..f4940b5 --- /dev/null +++ b/src/objectinspector/propertyItems/lrcolorpropitem.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRCOLORPROPITEM_H +#define LRCOLORPROPITEM_H + +#include "lrobjectpropitem.h" + +namespace LimeReport{ + +class ColorPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + ColorPropItem():ObjectPropItem(){} + ColorPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const; + void setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index); + bool paint(QPainter *painter, const QStyleOptionViewItemV4 &option, const QModelIndex &index); +}; + +} +#endif // LRCOLORPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrdatasourcepropitem.cpp b/src/objectinspector/propertyItems/lrdatasourcepropitem.cpp new file mode 100644 index 0000000..e107edb --- /dev/null +++ b/src/objectinspector/propertyItems/lrdatasourcepropitem.cpp @@ -0,0 +1,103 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrdatasourcepropitem.h" +#include "lrobjectpropitem.h" +#include "lrbasedesignintf.h" +#include "lrreportengine_p.h" +#include "../editors/lrcomboboxeditor.h" +#include + +namespace{ + LimeReport::ObjectPropItem * createDatasourcePropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::DatasourcePropItem(object, objects, name, displayName, data, parent, readonly); + } + + LimeReport::ObjectPropItem* createFieldPropItem(QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly){ + return new LimeReport::FieldPropItem(object, objects, name, displayName, data, parent, readonly); + } + + bool registredDatasouceProp = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("datasource","LimeReport::DataBandDesignIntf"),QObject::tr("datasource"),createDatasourcePropItem + ); + bool registredImageDatasouceProp = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("datasource","LimeReport::ImageItem"),QObject::tr("datasource"),createDatasourcePropItem + ); + bool registredImageFieldProp = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("field","LimeReport::ImageItem"),QObject::tr("field"),createFieldPropItem + ); +} + +QWidget* LimeReport::DatasourcePropItem::createProperyEditor(QWidget *parent) const{ + ComboBoxEditor *editor = new ComboBoxEditor(parent); + editor->setEditable(true); + LimeReport::BaseDesignIntf *item=dynamic_cast(object()); + if (item){ + editor->addItems(item->reportEditor()->dataManager()->dataSourceNames()); + } + return editor; +} + +void LimeReport::DatasourcePropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const{ + ComboBoxEditor *editor=qobject_cast(propertyEditor); + editor->setTextValue(propertyValue().toString()); +} + +void LimeReport::DatasourcePropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index){ + model->setData(index,qobject_cast(propertyEditor)->text()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + + +QWidget *LimeReport::FieldPropItem::createProperyEditor(QWidget *parent) const +{ + ComboBoxEditor *editor = new ComboBoxEditor(parent); + editor->setEditable(true); + LimeReport::BaseDesignIntf *item=dynamic_cast(object()); + int propertyIndex = object()->metaObject()->indexOfProperty("datasource"); + + if (item && propertyIndex>0){ + editor->addItems(item->reportEditor()->dataManager()->fieldNames(object()->property("datasource").toString())); + } + return editor; +} + +void LimeReport::FieldPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + ComboBoxEditor *editor=qobject_cast(propertyEditor); + editor->setTextValue(propertyValue().toString()); +} + +void LimeReport::FieldPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->text()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} diff --git a/src/objectinspector/propertyItems/lrdatasourcepropitem.h b/src/objectinspector/propertyItems/lrdatasourcepropitem.h new file mode 100644 index 0000000..60f7062 --- /dev/null +++ b/src/objectinspector/propertyItems/lrdatasourcepropitem.h @@ -0,0 +1,61 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRDATASOURCEPROPITEM_H +#define LRDATASOURCEPROPITEM_H + +#include "lrobjectpropitem.h" +namespace LimeReport{ + +class DatasourcePropItem : public LimeReport::ObjectPropItem +{ + Q_OBJECT + +public: + DatasourcePropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget *, const QModelIndex &) const; + void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &); +}; + +class FieldPropItem : public LimeReport::ObjectPropItem +{ + Q_OBJECT + +public: + FieldPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const; + void setModelData(QWidget *propertyEditor, QAbstractItemModel *, const QModelIndex &index); +}; + +} +#endif // LRDATASOURCEPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrenumpropitem.cpp b/src/objectinspector/propertyItems/lrenumpropitem.cpp new file mode 100644 index 0000000..ab56e5d --- /dev/null +++ b/src/objectinspector/propertyItems/lrenumpropitem.cpp @@ -0,0 +1,107 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrenumpropitem.h" +#include "../editors/lrcomboboxeditor.h" +#include "lrbanddesignintf.h" + +namespace { + +LimeReport::ObjectPropItem * createEnumPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) +{ + return new LimeReport::EnumPropItem(object, objects, name, displayName, data, parent, readonly); +} +bool registred = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("enum",""),QObject::tr("enum"),createEnumPropItem +); + +} + +namespace LimeReport { + +QWidget *EnumPropItem::createProperyEditor(QWidget *parent) const +{ + ComboBoxEditor *editor = new ComboBoxEditor(parent,false); + connect(editor,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotEnumChanged(QString))); + + QStringList enumValues; + QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); + for (int i=0;iaddItems(enumValues); + return editor; +} + +void EnumPropItem::slotEnumChanged(const QString &text) +{ + if ( nameByType(object()->property(propertyName().toLatin1()).toInt())!=text){ + beginChangeValue(); + object()->setProperty(propertyName().toLatin1(),typeByName(text)); + setPropertyValue(typeByName(text)); + endChangeValue(); + } +} + +void EnumPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + ComboBoxEditor *editor=qobject_cast(propertyEditor); + editor->setTextValue(nameByType(propertyValue().toInt())); +} + +void EnumPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + object()->setProperty(propertyName().toLatin1(),typeByName(qobject_cast(propertyEditor)->text())); + model->setData(index,object()->property(propertyName().toLatin1())); +} + +QString EnumPropItem::nameByType(int value) const +{ + QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); + return propEnum.valueToKey(value); +} + +int EnumPropItem::typeByName(const QString &value) const +{ + QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); + return propEnum.keyToValue(value.toLatin1()); +} + +QString EnumPropItem::displayValue() const +{ + return nameByType((propertyValue().toInt())); +} + +} diff --git a/src/objectinspector/propertyItems/lrenumpropitem.h b/src/objectinspector/propertyItems/lrenumpropitem.h new file mode 100644 index 0000000..7cd23c1 --- /dev/null +++ b/src/objectinspector/propertyItems/lrenumpropitem.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRENUMPROPITEM_H +#define LRENUMPROPITEM_H + +#include "lrobjectpropitem.h" + +namespace LimeReport{ +class EnumPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + EnumPropItem():ObjectPropItem(){} + EnumPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_settingValue(false){} + EnumPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly, QVector acceptableValues) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_acceptableValues(acceptableValues),m_settingValue(false){} + QWidget* createProperyEditor(QWidget *parent) const; + QString displayValue() const; + void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex &) const; + void setModelData(QWidget * propertyEditor, QAbstractItemModel * model, const QModelIndex & index); + QVector acceptableValues() const {return m_acceptableValues;} +protected: + QString nameByType(int propertyValue) const; + int typeByName(const QString& propertyValue) const; +private slots: + void slotEnumChanged(const QString& text); +private: + QVector m_acceptableValues; + bool m_settingValue; +}; +} +#endif // LRENUMPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrflagspropitem.cpp b/src/objectinspector/propertyItems/lrflagspropitem.cpp new file mode 100644 index 0000000..edf4c86 --- /dev/null +++ b/src/objectinspector/propertyItems/lrflagspropitem.cpp @@ -0,0 +1,147 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrflagspropitem.h" +#include "lrenumpropitem.h" +#include "lrboolpropitem.h" +#include "../editors/lrcheckboxeditor.h" +#include "lrobjectitemmodel.h" +#include +#include +#include +#include +#include +#include + +namespace { + +LimeReport::ObjectPropItem * createFlagsPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) +{ + return new LimeReport::FlagsPropItem(object, objects, name, displayName, data, parent, readonly); +} +bool registred = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("flags",""),QObject::tr("flags"),createFlagsPropItem +); + +} // namespace + +namespace LimeReport { + +void FlagsPropItem::createChildren() +{ + QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); + for (int i=0;iappendItem(new LimeReport::FlagPropItem( + object(), objects(), QString(propEnum.key(i)), QString(propEnum.key(i)), + bool((propertyValue().toInt() & propEnum.keyToValue(propEnum.key(i)))==propEnum.keyToValue(propEnum.key(i))), + this, false + ) + ); + } +} + +void FlagsPropItem::updateChildren() +{ + QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); + for (int i=0;isetPropertyValue(bool((propertyValue().toInt() & propEnum.keyToValue(propEnum.key(i)))==propEnum.keyToValue(propEnum.key(i)))); + } +} + +FlagsPropItem::FlagsPropItem(QObject *object, ObjectPropItem::ObjectsList *objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly) +{ + createChildren(); +} + +FlagsPropItem::FlagsPropItem(QObject *object, ObjectPropItem::ObjectsList *objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly, QSet acceptableValues) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_acceptableValues(acceptableValues){} + +QString FlagsPropItem::displayValue() const +{ + QString result; + QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); + for (int i=0;i(propertyEditor); + editor->setChecked(propertyValue().toBool()); +} + +void FlagPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + bool value = qobject_cast(propertyEditor)->isChecked(); + model->setData(index,value); + int flags = object()->property(parent()->propertyName().toLatin1()).toInt(); + if (value) flags=flags | valueByName(displayName()); + else if (flags&valueByName(displayName())) flags=flags ^ valueByName(displayName()); + object()->setProperty(parent()->propertyName().toLatin1(),flags); + parent()->setPropertyValue(flags); +} + +int FlagPropItem::valueByName(const QString& typeName) +{ + QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(parent()->propertyName().toLatin1())).enumerator(); + return propEnum.keyToValue(typeName.toLatin1()); +} + +} // namespace LimeReport + + diff --git a/src/objectinspector/propertyItems/lrflagspropitem.h b/src/objectinspector/propertyItems/lrflagspropitem.h new file mode 100644 index 0000000..7213d4d --- /dev/null +++ b/src/objectinspector/propertyItems/lrflagspropitem.h @@ -0,0 +1,71 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRFLAGSPROPEDITOR_H +#define LRFLAGSPROPEDITOR_H + +#include "lrobjectpropitem.h" +#include "lrboolpropitem.h" + +namespace LimeReport{ + +class FlagsPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + FlagsPropItem():ObjectPropItem(){} + FlagsPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly); + FlagsPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly, QSet acceptableValues); + virtual QString displayValue() const; + virtual void setPropertyValue(QVariant propertyValue); +private slots: + void slotEnumChanged(QString); +private: + QSet m_acceptableValues; + QString nameByType(int propertyValue) const; + int typeByName(QString propertyValue) const; + void createChildren(); + void updateChildren(); +}; + +class FlagPropItem : public BoolPropItem{ +public: + FlagPropItem():BoolPropItem(){} + FlagPropItem(QObject* object, ObjectsList* objects, const QString& propName, const QString& displayName, const QVariant& propertyValue, ObjectPropItem* parent, bool readonly); + virtual void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex & ) const; + virtual void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &); + virtual QString displayValue() const{return "";} +private: + int valueByName(const QString &typeName); +}; + + +} // namespace LimeReport + +#endif // LRFLAGSPROPEDITOR_H diff --git a/src/objectinspector/propertyItems/lrfontpropitem.cpp b/src/objectinspector/propertyItems/lrfontpropitem.cpp new file mode 100644 index 0000000..16f20c6 --- /dev/null +++ b/src/objectinspector/propertyItems/lrfontpropitem.cpp @@ -0,0 +1,159 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include + +#include "lrfontpropitem.h" +#include "editors/lrbuttonlineeditor.h" +#include "editors/lrfonteditor.h" +#include "editors/lrcheckboxeditor.h" +#include "lrobjectitemmodel.h" + +namespace{ + LimeReport::ObjectPropItem * createFontPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::FontPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registredFontProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QFont",""),QObject::tr("QFont"),createFontPropItem); +} + + +namespace LimeReport{ + +FontPropItem::FontPropItem(QObject *object, ObjectPropItem::ObjectsList *objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly) +{ + m_bold = new FontAttribPropItem(object,objects,"bold",tr("bold"),propertyValue().value().bold(),this,false); + m_italic = new FontAttribPropItem(object,objects,"italic",tr("italic"),propertyValue().value().italic(),this,false); + m_underline = new FontAttribPropItem(object,objects,"underline",tr("underline"),propertyValue().value().underline(),this,false); + m_pointSize = new FontPointSizePropItem(object,0,"pointSize",tr("size"),propertyValue().value().pointSize(),this,false); + m_family = new FontFamilyPropItem(object,0,"family",tr("family"),propertyValue().value(),this,false); + + this->appendItem(m_family); + this->appendItem(m_pointSize); + this->appendItem(m_bold); + this->appendItem(m_italic); + this->appendItem(m_underline); +} + +QWidget *FontPropItem::createProperyEditor(QWidget *parent) const +{ + return new FontEditor(parent); +} + +QString FontPropItem::displayValue() const +{ + return toString(propertyValue().value());//propertyValue().toString();//toString(propertyValue().value()); +} + +void FontPropItem::setPropertyEditorData(QWidget* propertyEditor, const QModelIndex &) const +{ + FontEditor *editor =qobject_cast(propertyEditor); + editor->setFontValue(propertyValue().value()); +} + +void FontPropItem::setModelData(QWidget* propertyEditor, QAbstractItemModel* model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->fontValue()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +void FontPropItem::setPropertyValue(QVariant value) +{ + ObjectPropItem::setPropertyValue(value); + m_bold->setPropertyValue(value.value().bold()); + m_italic->setPropertyValue(value.value().italic()); + m_underline->setPropertyValue(value.value().underline()); + m_pointSize->setPropertyValue(value.value().pointSize()); + m_family->setPropertyValue(value.value()); +} + +QString FontPropItem::toString(QFont value) const +{ + QString attribs=""; + if (value.bold()) (attribs=="") ? attribs+="b":attribs+=",b"; + if (value.italic()) (attribs=="") ? attribs+="i":attribs+=",i"; + if (attribs!="") attribs="["+attribs+"]"; + return "\""+ value.family()+"\" "+QString::number(value.pointSize())+" "+attribs; +} + +QString FontFamilyPropItem::displayValue() const +{ + QFont font = propertyValue().value(); + return font.family(); +} + +QWidget *FontFamilyPropItem::createProperyEditor(QWidget *parent) const +{ + QFontComboBox* editor = new QFontComboBox(parent); + editor->setFont(propertyValue().value()); + return editor; +} + +void FontFamilyPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + QFontComboBox* editor = qobject_cast(propertyEditor); + editor->setCurrentFont(propertyValue().value()); +} + +void FontFamilyPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + QFont font = qobject_cast(propertyEditor)->currentFont(); + model->setData(index,font); + object()->setProperty(parent()->propertyName().toLatin1(),font); +} + +void FontAttribPropItem::setModelData(QWidget *propertyEditor , QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->isChecked()); + QFont font = object()->property(parent()->propertyName().toLatin1()).value(); + if (propertyName()=="bold"){ + font.setBold(propertyValue().toBool()); + } + if (propertyName()=="italic"){ + font.setItalic(propertyValue().toBool()); + } + if (propertyName()=="underline"){ + font.setUnderline(propertyValue().toBool()); + } + object()->setProperty(parent()->propertyName().toLatin1(),font); +} + +void FontPointSizePropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->value()); + QFont font = object()->property(parent()->propertyName().toLatin1()).value(); + font.setPointSize(propertyValue().toInt()); + object()->setProperty(parent()->propertyName().toLatin1(),font); +} + +} diff --git a/src/objectinspector/propertyItems/lrfontpropitem.h b/src/objectinspector/propertyItems/lrfontpropitem.h new file mode 100644 index 0000000..92c0405 --- /dev/null +++ b/src/objectinspector/propertyItems/lrfontpropitem.h @@ -0,0 +1,92 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRFONTPROPITEM_H +#define LRFONTPROPITEM_H +#include "lrobjectpropitem.h" +#include "lrboolpropitem.h" +#include "lrintpropitem.h" + +namespace LimeReport{ + +class FontFamilyPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + FontFamilyPropItem():ObjectPropItem(){} + FontFamilyPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly=true) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QString displayValue() const; + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const; + void setModelData(QWidget *propertyEditor , QAbstractItemModel *model, const QModelIndex &index); +}; + +class FontPointSizePropItem : public IntPropItem +{ + Q_OBJECT +public: + FontPointSizePropItem():IntPropItem(){} + FontPointSizePropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly=true) + :IntPropItem(object, objects, name, displayName, value, parent, readonly){} + void setModelData(QWidget *propertyEditor , QAbstractItemModel *model, const QModelIndex &index); +}; + +class FontAttribPropItem : public BoolPropItem +{ + Q_OBJECT +public: + FontAttribPropItem():BoolPropItem(){} + FontAttribPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly=true) + :BoolPropItem(object, objects, name, displayName, value, parent, readonly){} + void setModelData(QWidget *propertyEditor , QAbstractItemModel *model, const QModelIndex &index); +}; + +class FontPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + FontPropItem():ObjectPropItem(){} + FontPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly); + QWidget* createProperyEditor(QWidget *parent) const; + QString displayValue() const; + void setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const; + void setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index); + void setPropertyValue(QVariant value); +protected: + QString toString(QFont value) const; + FontPointSizePropItem* m_pointSize; + FontAttribPropItem *m_bold; + FontAttribPropItem *m_italic; + FontAttribPropItem *m_underline; + FontFamilyPropItem *m_family; +}; + +} +#endif // LRFONTPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrgroupfieldpropitem.cpp b/src/objectinspector/propertyItems/lrgroupfieldpropitem.cpp new file mode 100644 index 0000000..b7027c5 --- /dev/null +++ b/src/objectinspector/propertyItems/lrgroupfieldpropitem.cpp @@ -0,0 +1,76 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrgroupfieldpropitem.h" +#include "../editors/lrcomboboxeditor.h" +#include "lrgroupbands.h" +#include "lrreportengine_p.h" + +namespace { + LimeReport::ObjectPropItem* createFieldPropItem(QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly){ + return new LimeReport::GroupFieldPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registredGroupFieldProp = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("groupFieldName","LimeReport::GroupBandHeader"),QObject::tr("field"),createFieldPropItem + ); +} +namespace LimeReport { + +QWidget *GroupFieldPropItem::createProperyEditor(QWidget *parent) const +{ + ComboBoxEditor *editor = new ComboBoxEditor(parent); + editor->setEditable(true); + GroupBandHeader *item=dynamic_cast(object()); + if (item){ + DataBandDesignIntf* dataBand = dynamic_cast(item->parentBand()); + if (dataBand){ + int propertyIndex = dataBand->metaObject()->indexOfProperty("datasource"); + + if (item && propertyIndex>0){ + editor->addItems(item->reportEditor()->dataManager()->fieldNames(dataBand->property("datasource").toString())); + } + } + } + return editor; +} + +void GroupFieldPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + ComboBoxEditor *editor=qobject_cast(propertyEditor); + editor->setTextValue(propertyValue().toString()); +} + +void GroupFieldPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->text()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +} + diff --git a/src/objectinspector/propertyItems/lrgroupfieldpropitem.h b/src/objectinspector/propertyItems/lrgroupfieldpropitem.h new file mode 100644 index 0000000..3f72fff --- /dev/null +++ b/src/objectinspector/propertyItems/lrgroupfieldpropitem.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRGROUPFIELDPROPITEM_H +#define LRGROUPFIELDPROPITEM_H + +#include "lrobjectpropitem.h" +namespace LimeReport{ + +class GroupFieldPropItem : public ObjectPropItem +{ +public: + GroupFieldPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const; + void setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index); +}; + +} + + +#endif // LRGROUPFIELDPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrimagepropitem.cpp b/src/objectinspector/propertyItems/lrimagepropitem.cpp new file mode 100644 index 0000000..753e18c --- /dev/null +++ b/src/objectinspector/propertyItems/lrimagepropitem.cpp @@ -0,0 +1,71 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrimagepropitem.h" +#include "editors/lrimageeditor.h" + +namespace{ + LimeReport::ObjectPropItem * createImagePropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::ImagePropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registredImageProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QImage",""),QObject::tr("QImage"),createImagePropItem); +} + +namespace LimeReport{ + +QWidget* ImagePropItem::createProperyEditor(QWidget *parent) const +{ + return new ImageEditor(parent); +} + +QString ImagePropItem::displayValue() const +{ + return (propertyValue().isNull())?"":"Picture"; +} + +void ImagePropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + ImageEditor *editor =qobject_cast(propertyEditor); + editor->setImage(propertyValue().value()); +} + +void ImagePropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->image()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +QIcon ImagePropItem::iconValue() const +{ + return QIcon(QPixmap::fromImage(propertyValue().value())); +} + +} diff --git a/src/objectinspector/propertyItems/lrimagepropitem.h b/src/objectinspector/propertyItems/lrimagepropitem.h new file mode 100644 index 0000000..e61c9b9 --- /dev/null +++ b/src/objectinspector/propertyItems/lrimagepropitem.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRIMAGEPROPITEM_H +#define LRIMAGEPROPITEM_H + +#include "lrobjectpropitem.h" +namespace LimeReport{ + +class ImagePropItem : public ObjectPropItem +{ + Q_OBJECT +public: + ImagePropItem():ObjectPropItem(){} + ImagePropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + QString displayValue() const; + void setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const; + void setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index); + virtual QIcon iconValue() const; +}; + +} +#endif // LRIMAGEPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrintpropitem.cpp b/src/objectinspector/propertyItems/lrintpropitem.cpp new file mode 100644 index 0000000..af1d580 --- /dev/null +++ b/src/objectinspector/propertyItems/lrintpropitem.cpp @@ -0,0 +1,65 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrintpropitem.h" +#include +#include + +namespace{ + LimeReport::ObjectPropItem * createIntPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::IntPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registred = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("int",""),QObject::tr("int"),createIntPropItem); +} // namespace + +namespace LimeReport{ + +QWidget *IntPropItem::createProperyEditor(QWidget *parent) const +{ + QSpinBox *editor= new QSpinBox(parent); + editor->setMaximum(std::numeric_limits::max()); + editor->setMinimum(std::numeric_limits::min()); + return editor; +} + +void IntPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + QSpinBox *editor =qobject_cast(propertyEditor); + editor->setValue(propertyValue().toInt()); +} + +void IntPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->value()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +} // namespace LimeReport diff --git a/src/objectinspector/propertyItems/lrintpropitem.h b/src/objectinspector/propertyItems/lrintpropitem.h new file mode 100644 index 0000000..2373cab --- /dev/null +++ b/src/objectinspector/propertyItems/lrintpropitem.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRINTPROPITEM_H +#define LRINTPROPITEM_H + +#include "lrobjectpropitem.h" + +namespace LimeReport { +class IntPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + IntPropItem():ObjectPropItem(){} + IntPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex &) const; + void setModelData(QWidget * propertyEditor, QAbstractItemModel * model, const QModelIndex & index); +}; + +} // namespace LimeReport + +#endif // LRINTPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrqrealpropitem.cpp b/src/objectinspector/propertyItems/lrqrealpropitem.cpp new file mode 100644 index 0000000..e027163 --- /dev/null +++ b/src/objectinspector/propertyItems/lrqrealpropitem.cpp @@ -0,0 +1,67 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrqrealpropitem.h" + +#include +#include + +namespace{ + LimeReport::ObjectPropItem * createQRealPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::QRealPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registred = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("qreal",""),QObject::tr("qreal"),createQRealPropItem); + bool registredDouble = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("double",""),QObject::tr("qreal"),createQRealPropItem); +} + +namespace LimeReport{ + +QWidget *QRealPropItem::createProperyEditor(QWidget *parent) const +{ + QDoubleSpinBox *editor= new QDoubleSpinBox(parent); + editor->setMaximum(std::numeric_limits::max()); + editor->setMinimum(std::numeric_limits::max()*-1); + return editor; +} + +void QRealPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + QDoubleSpinBox *editor =qobject_cast(propertyEditor); + editor->setValue(propertyValue().toDouble()); +} + +void QRealPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->value()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +} diff --git a/src/objectinspector/propertyItems/lrqrealpropitem.h b/src/objectinspector/propertyItems/lrqrealpropitem.h new file mode 100644 index 0000000..d06872f --- /dev/null +++ b/src/objectinspector/propertyItems/lrqrealpropitem.h @@ -0,0 +1,52 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRQREALPROPITEM_H +#define LRQREALPROPITEM_H + +#include "lrobjectpropitem.h" + +namespace LimeReport { + +class QRealPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + QRealPropItem():ObjectPropItem(){} + QRealPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex &) const; + void setModelData(QWidget * propertyEditor, QAbstractItemModel * model, const QModelIndex & index); +}; + +} + + +#endif // LRQREALPROPITEM_H diff --git a/src/objectinspector/propertyItems/lrrectproptem.cpp b/src/objectinspector/propertyItems/lrrectproptem.cpp new file mode 100644 index 0000000..5335c9a --- /dev/null +++ b/src/objectinspector/propertyItems/lrrectproptem.cpp @@ -0,0 +1,210 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrrectproptem.h" +#include "lrobjectpropitem.h" +#include "lrbanddesignintf.h" +#include "lrpageitemdesignintf.h" +#include "lrglobal.h" +#include "lrobjectitemmodel.h" + +#include +#include +#include +#include + +namespace{ + LimeReport::ObjectPropItem * createReqtItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly + ){ + return new LimeReport::RectPropItem(object, objects, name, displayName, data, parent, readonly); + } + LimeReport::ObjectPropItem * createReqtMMItem( + QObject*object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly + ){ + return new LimeReport::RectMMPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registredRectProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QRect",""),QObject::tr("QRect"),createReqtItem); + bool registredRectFProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QRectF",""),QObject::tr("QRectF"),createReqtItem); + bool registredRectMMProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("geometry","LimeReport::BaseDesignIntf"),QObject::tr("geometry"),createReqtMMItem); +} + +namespace LimeReport{ + +QRectF modifyRect(QRectF rect, const QString& name, qreal itemValue){ + + if (name=="x"){qreal width=rect.width(); rect.setX(itemValue);rect.setWidth(width);} + if (name=="y"){qreal heigh=rect.height(); rect.setY(itemValue);rect.setHeight(heigh);} + if (name=="height"){rect.setHeight(itemValue);} + if (name=="width"){rect.setWidth(itemValue);} + + return rect; +} + +} + +LimeReport::RectPropItem::RectPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly): + ObjectPropItem(object, objects, name, displayName, value,parent,readonly) +{ + QRect rect=value.toRect(); + this->appendItem(new ObjectPropItem(object, objects, "x","x", rect.x(),this)); + this->appendItem(new ObjectPropItem(object, objects, "y","x", rect.y(),this)); + this->appendItem(new ObjectPropItem(object, objects, "width",tr("width"), rect.width(),this)); + this->appendItem(new ObjectPropItem(object, objects, "heigh",tr("height"),rect.height(),this)); +} + +QString LimeReport::RectPropItem::displayValue() const +{ + switch(propertyValue().type()){ + case QVariant::Rect: + return rectToString(propertyValue().toRect()); + break; + case QVariant::RectF: + return rectToString(propertyValue().toRect()); + break; + default : + return ObjectPropItem::displayValue(); + + } +} +template QString LimeReport::RectPropItem::rectToString(T rect) const +{ + return QString("[%1,%2] %3x%4").arg(rect.x()).arg(rect.y()).arg(rect.height()).arg(rect.width()); +} + +LimeReport::RectMMPropItem::RectMMPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool /*readonly*/): + ObjectPropItem(object, objects, name, displayName, value,parent) +{ + QRectF rect=value.toRect(); + LimeReport::BandDesignIntf* band = dynamic_cast(object); + LimeReport::PageItemDesignIntf *page = dynamic_cast(object); + if(band){ + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "x","x",rect.x()/10,this,true)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "y","y",rect.y()/10,this,true)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "width",tr("width"), rect.width()/10,this,true)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "height",tr("height"), rect.height()/10,this,false)); + } else if(page){ + this->appendItem(new LimeReport::RectMMValuePropItem(object, 0, "x","x",rect.x()/10,this,true)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, 0, "y","y",rect.y()/10,this,true)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, 0,"width", tr("width"), rect.width()/10,this,false)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, 0, "height", tr("height"), rect.height()/10,this,false)); + } else { + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "x","x",rect.x()/10,this,false)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "y","y",rect.y()/10,this,false)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "width", tr("width"), rect.width()/10,this,false)); + this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "height", tr("height"), rect.height()/10,this,false)); + } + LimeReport::BaseDesignIntf * item = dynamic_cast(object); + if (item){ + connect(item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)),this,SLOT(itemGeometryChanged(QObject*,QRectF,QRectF))); + connect(item,SIGNAL(posChanged(QObject*,QPointF,QPointF)),this,SLOT(itemPosChanged(QObject*,QPointF,QPointF))); + } + +} +QString LimeReport::RectMMPropItem::displayValue() const +{ + QRectF rect = propertyValue().toRectF(); + return QString("[%1,%2] %3x%4 mm") + .arg(rect.x()/10,0,'f',2) + .arg(rect.y()/10,0,'f',2) + .arg(rect.height()/10,0,'f',2) + .arg(rect.width()/10,0,'f',2); +} + +LimeReport::RectMMValuePropItem::RectMMValuePropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly +):ObjectPropItem(object, objects, name, displayName, value,parent,readonly){} + +QWidget * LimeReport::RectMMValuePropItem::createProperyEditor(QWidget *parent) const +{ + QDoubleSpinBox *editor= new QDoubleSpinBox(parent); + editor->setMaximum(100000); + editor->setSuffix(" mm"); + return editor; +} + +void LimeReport::RectMMValuePropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + QDoubleSpinBox *editor = qobject_cast(propertyEditor); + editor->setValue(propertyValue().toDouble()); +} + +void LimeReport::RectMMValuePropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->value()); + QRectF rect=object()->property(parent()->propertyName().toLatin1()).toRectF(); + object()->setProperty(parent()->propertyName().toLatin1(),modifyRect(rect,propertyName(),propertyValue().toReal()*10)); +} + +QString LimeReport::RectMMValuePropItem::displayValue() const +{ + return QString::number(propertyValue().toReal())+" "+QObject::tr("mm"); +} + +void LimeReport::RectMMPropItem::itemPosChanged(QObject* /*object*/, QPointF newPos, QPointF oldPos) +{ + if (newPos.x()!=oldPos.x()){ + setValue("x",newPos.x()); + } + if (newPos.y()!=oldPos.y()){ + setValue("y",newPos.y()); + } +} + +void LimeReport::RectMMPropItem::itemGeometryChanged(QObject * /*object*/, QRectF newGeometry, QRectF oldGeometry) +{ + if (newGeometry.x()!=oldGeometry.x()){ + setValue("x",newGeometry.x()); + } + if (newGeometry.y()!=oldGeometry.y()){ + setValue("y",newGeometry.y()); + } + if (newGeometry.width()!=oldGeometry.width()){ + setValue("width",newGeometry.width()); + } + if (newGeometry.height()!=oldGeometry.height()){ + setValue("height",newGeometry.height()); + } +} + +void LimeReport::RectMMPropItem::setValue(const QString &name, qreal value) +{ + if (name!=""){ + LimeReport::ObjectPropItem* propItem = findChild(name); + if (propItem) { + propItem->setPropertyValue(value/10); + setPropertyValue(LimeReport::modifyRect(propertyValue().toRectF(),name,value)); + LimeReport::QObjectPropertyModel *itemModel=dynamic_cast(model()); + if (itemModel) { + itemModel->itemDataChanged(modelIndex()); + if (propItem->modelIndex().isValid()) + itemModel->itemDataChanged(propItem->modelIndex()); + } + } + } +} diff --git a/src/objectinspector/propertyItems/lrrectproptem.h b/src/objectinspector/propertyItems/lrrectproptem.h new file mode 100644 index 0000000..b74ba75 --- /dev/null +++ b/src/objectinspector/propertyItems/lrrectproptem.h @@ -0,0 +1,72 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRRECTPROPTEM_H +#define LRRECTPROPTEM_H +#include "lrobjectpropitem.h" +#include +#include + +namespace LimeReport{ + +class RectPropItem : public ObjectPropItem{ + Q_OBJECT +public: + RectPropItem():ObjectPropItem(){} + RectPropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly=true); + QString displayValue() const; + template QString rectToString(T rect) const; +}; + +class RectMMPropItem : public ObjectPropItem{ + Q_OBJECT +public: + RectMMPropItem():ObjectPropItem(){} + RectMMPropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly=true); + QString displayValue() const; +public slots: + void itemPosChanged(QObject* /*object*/, QPointF newPos, QPointF oldPos); + void itemGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); +private: + void setValue(const QString& propertyName, qreal propertyValue); +}; + +class RectMMValuePropItem : public ObjectPropItem{ + Q_OBJECT +public: + RectMMValuePropItem():ObjectPropItem(){} + RectMMValuePropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly ); + QString displayValue() const; + QWidget* createProperyEditor(QWidget *) const; + void setPropertyEditorData(QWidget *, const QModelIndex &) const; + void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &); +}; + +} +#endif // LRRECTPROPTEM_H diff --git a/src/objectinspector/propertyItems/lrstringpropitem.cpp b/src/objectinspector/propertyItems/lrstringpropitem.cpp new file mode 100644 index 0000000..56445a9 --- /dev/null +++ b/src/objectinspector/propertyItems/lrstringpropitem.cpp @@ -0,0 +1,72 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include + +#include "lrstringpropitem.h" +#include "lrobjectpropitem.h" +#include "objectinspector/editors/lrbuttonlineeditor.h" + +namespace{ + LimeReport::ObjectPropItem * createStringPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::StringPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registredStringProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QString",""),QObject::tr("QString"),createStringPropItem); +} // namespace + +namespace LimeReport{ + + +QWidget * StringPropItem::createProperyEditor(QWidget *parent) const +{ + return new ButtonLineEditor(object()->objectName()+"."+displayName(),parent); +} + +void StringPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + ButtonLineEditor *editor =qobject_cast(propertyEditor); + editor->setText(propertyValue().toString()); +} + +void StringPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index,qobject_cast(propertyEditor)->text()); + object()->setProperty(propertyName().toLatin1(),propertyValue()); +} + +QString StringPropItem::displayValue() const +{ + return propertyValue().toString().simplified(); +} + +} // namespace LimeReport diff --git a/src/objectinspector/propertyItems/lrstringpropitem.h b/src/objectinspector/propertyItems/lrstringpropitem.h new file mode 100644 index 0000000..091ef1c --- /dev/null +++ b/src/objectinspector/propertyItems/lrstringpropitem.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSTRINGPROPITEM_H +#define LRSTRINGPROPITEM_H +#include "lrobjectpropitem.h" + +namespace LimeReport{ +class StringPropItem : public LimeReport::ObjectPropItem{ + Q_OBJECT +public: + StringPropItem():ObjectPropItem(){} + StringPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QWidget* createProperyEditor(QWidget *parent) const; + QString displayValue() const; + void setPropertyEditorData(QWidget *, const QModelIndex &) const; + void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &); +}; +} // namespace LimeReport +#endif // LRSTRINGPROPITEM_H diff --git a/src/objectsbrowser/lrobjectbrowser.cpp b/src/objectsbrowser/lrobjectbrowser.cpp new file mode 100644 index 0000000..89329d3 --- /dev/null +++ b/src/objectsbrowser/lrobjectbrowser.cpp @@ -0,0 +1,279 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrobjectbrowser.h" +#include "lritemdesignintf.h" +#include "lrbanddesignintf.h" +#include + +namespace LimeReport{ + + +ObjectBrowser::ObjectBrowser(QWidget *parent) + :QWidget(parent), m_changingItemSelection(false) +{ + QVBoxLayout *layout = new QVBoxLayout(this); + setLayout(layout); + layout->setMargin(2); + m_treeView = new QTreeWidget(this); + layout->addWidget(m_treeView); + m_treeView->headerItem()->setText(0,tr("Objects")); + m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); +} + +void ObjectBrowser::setReportEditor(ReportDesignWidget *report) +{ + m_report=report; + connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); + connect(m_report, SIGNAL(loaded()), this, SLOT(slotReportLoaded())); + connect(m_report, SIGNAL(activePageChanged()), this, SLOT(slotActivePageChanged())); + + connect(m_report,SIGNAL(itemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), + this, SLOT(slotItemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*))); + connect(m_report, SIGNAL(itemDeleted(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), + this, SLOT(slotItemDeleted(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*))); + + connect(m_report, SIGNAL(bandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + this, SLOT(slotBandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); + connect(m_report, SIGNAL(bandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + this, SLOT(slotBandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); + connect(m_treeView, SIGNAL(itemSelectionChanged()), + this, SLOT(slotObjectTreeItemSelectionChanged()) ); + connect(m_report, SIGNAL(itemSelected(LimeReport::BaseDesignIntf*)), + this, SLOT(slotItemSelected(LimeReport::BaseDesignIntf*))); + + connect(m_report, SIGNAL(multiItemSelected()), + this, SLOT(slotMultiItemSelected()) ); + + buildTree(); +} + +void ObjectBrowser::setMainWindow(QMainWindow *mainWindow) +{ + m_mainWindow=mainWindow; +} + +void ObjectBrowser::slotClear() +{ + +} + +void ObjectBrowser::fillNode(QTreeWidgetItem* parentNode, BaseDesignIntf* reportItem, BaseDesignIntf *ignoredItem){ + foreach (BaseDesignIntf* item, reportItem->childBaseItems()) { + if (item != ignoredItem){ + ObjectBrowserNode* treeItem = new ObjectBrowserNode(parentNode); + treeItem->setText(0,item->objectName()); + treeItem->setObject(item); + treeItem->setIcon(0,QIcon(":/items/"+extractClassName(item->metaObject()->className()))); + connect(item, SIGNAL(propertyObjectNameChanged(QString,QString)), + this, SLOT(slotPropertyObjectNameChanged(QString,QString))); + m_itemsMap.insert(item,treeItem); + parentNode->addChild(treeItem); + if (!item->childBaseItems().isEmpty()) + fillNode(treeItem,item, ignoredItem); + } + } +} + +void ObjectBrowser::buildTree(BaseDesignIntf* ignoredItem){ + + m_treeView->clear(); + m_itemsMap.clear(); + + ObjectBrowserNode *topLevelItem=new ObjectBrowserNode(m_treeView); + topLevelItem->setText(0,m_report->activePage()->objectName()); + topLevelItem->setObject(m_report->activePage()); + m_itemsMap.insert(m_report->activePage(),topLevelItem); + + m_treeView->addTopLevelItem(topLevelItem); + foreach (QGraphicsItem* item, m_report->activePage()->items()) { + if (item != ignoredItem){ + BaseDesignIntf* reportItem = dynamic_cast(item); + if (reportItem && reportItem->parentItem()==0){ + ObjectBrowserNode* tItem = new ObjectBrowserNode(topLevelItem); + tItem->setText(0,reportItem->objectName()); + tItem->setObject(reportItem); + tItem->setIcon(0,QIcon(":/items/"+extractClassName(reportItem->metaObject()->className()))); + connect(reportItem, SIGNAL(propertyObjectNameChanged(QString,QString)), + this, SLOT(slotPropertyObjectNameChanged(QString,QString))); + m_itemsMap.insert(reportItem,tItem); + fillNode(tItem,reportItem, ignoredItem); + topLevelItem->addChild(tItem); + } + } + } + m_treeView->sortItems(0,Qt::AscendingOrder); + m_treeView->expandAll(); +} + +void ObjectBrowser::findAndRemove(QTreeWidgetItem* node, BaseDesignIntf* item){ + + for (int i=0;ichildCount();i++){ + QTreeWidgetItem* treeItem = node->child(i); + if (treeItem->text(0)==item->objectName()){ + node->removeChild(treeItem); + break; + } else { + if (treeItem->childCount()>0) findAndRemove(treeItem, item); + } + } + +} + +void ObjectBrowser::slotPropertyObjectNameChanged(const QString &oldName, const QString &newName) +{ + Q_UNUSED(oldName) + if (m_itemsMap.contains(sender())){ + m_itemsMap.value(sender())->setText(0,newName); + } +} + +//void ObjectBrowser::slotObjectNameChanged(const QString &objectName) +//{ +// if (m_itemsMap.contains(sender())){ +// m_itemsMap.value(sender())->setText(0,objectName); +// } +//} + +void ObjectBrowser::removeItem(BaseDesignIntf *item) +{ + findAndRemove(m_treeView->topLevelItem(0),item); +} + +void ObjectBrowser::slotReportLoaded() +{ + buildTree(); +} + +void ObjectBrowser::slotActivePageChanged() +{ + buildTree(); +} + +void ObjectBrowser::slotBandAdded(LimeReport::PageDesignIntf *, BandDesignIntf *) +{ + buildTree(); +} + +void ObjectBrowser::slotBandDeleted(PageDesignIntf *, BandDesignIntf * item) +{ + buildTree(item); +} + +void ObjectBrowser::slotItemAdded(PageDesignIntf *, BaseDesignIntf *) +{ + buildTree(); +} + +void ObjectBrowser::slotItemDeleted(PageDesignIntf *, BaseDesignIntf *item) +{ + if (dynamic_cast(item)){ + buildTree(item); + } else { + removeItem(item); + } +} + +void ObjectBrowser::slotObjectTreeItemSelectionChanged() +{ + if (!m_changingItemSelection){ + m_changingItemSelection = true; + m_report->activePage()->clearSelection(); + foreach(QTreeWidgetItem* item, m_treeView->selectedItems()){ + ObjectBrowserNode* tn = dynamic_cast(item); + if (tn){ + + BaseDesignIntf* si = dynamic_cast(tn->object()); + if (si) { + m_report->activePage()->animateItem(si); + si->setSelected(true); + } + } + } + m_changingItemSelection = false; + } +} + +void ObjectBrowser::slotItemSelected(LimeReport::BaseDesignIntf *item) +{ + if (!m_changingItemSelection){ + m_changingItemSelection = true; + + m_treeView->selectionModel()->clear(); + BaseDesignIntf* bg = dynamic_cast(item); + if (bg){ + if (m_itemsMap.value(bg)) + m_itemsMap.value(bg)->setSelected(true); + } + + m_changingItemSelection = false; + } +} + +void ObjectBrowser::slotMultiItemSelected() +{ + m_changingItemSelection = true; + + m_treeView->selectionModel()->clear(); + + foreach(QGraphicsItem* item, m_report->activePage()->selectedItems()){ + BaseDesignIntf* bg = dynamic_cast(item); + if (bg){ + m_itemsMap.value(bg)->setSelected(true); + } + } + + m_changingItemSelection = false; +} + +void ObjectBrowserNode::setObject(QObject *value) +{ + m_object = value; +} + +QObject *ObjectBrowserNode::object() const +{ + return m_object; +} + +ObjectBrowserNode::ObjectBrowserNode(QTreeWidget *view) + :QTreeWidgetItem(view), m_object(0){} + +ObjectBrowserNode::ObjectBrowserNode(QTreeWidgetItem *parent) + :QTreeWidgetItem(parent), m_object(0){} + +bool ObjectBrowserNode::operator <(const QTreeWidgetItem &other) const +{ + BandDesignIntf* band1 = dynamic_cast(m_object); + BandDesignIntf* band2 = dynamic_cast(dynamic_cast(other).object()); + if (band1 && band2) return band1->bandIndex()bandIndex(); + return false; +} + +} //namespace LimeReport diff --git a/src/objectsbrowser/lrobjectbrowser.h b/src/objectsbrowser/lrobjectbrowser.h new file mode 100644 index 0000000..67ca58c --- /dev/null +++ b/src/objectsbrowser/lrobjectbrowser.h @@ -0,0 +1,85 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LROBJECTBROWSER_H +#define LROBJECTBROWSER_H + +#include +#include +#include "lrreportdesignwidget.h" +#include "lrbasedesignintf.h" + +namespace LimeReport{ + +class ObjectBrowserNode :public QTreeWidgetItem{ +public: + void setObject(QObject* value); + QObject* object() const; + explicit ObjectBrowserNode(QTreeWidget *view); + explicit ObjectBrowserNode(QTreeWidgetItem *parent); + bool operator <(const QTreeWidgetItem& other) const; +private: + QObject* m_object; +}; + +class ObjectBrowser :public QWidget +{ + Q_OBJECT +public: + ObjectBrowser(QWidget *parent=0); + void setReportEditor(LimeReport::ReportDesignWidget* report); + void setMainWindow(QMainWindow* mainWindow); +protected: + void fillNode(QTreeWidgetItem *parentNode, BaseDesignIntf *reportItem, BaseDesignIntf* ignoredItem = 0); + void buildTree(BaseDesignIntf *ignoredItem = 0); + void removeItem(BaseDesignIntf* item); + void findAndRemove(QTreeWidgetItem *node, BaseDesignIntf *item); +private slots: +// void slotObjectNameChanged(const QString& objectName); + void slotPropertyObjectNameChanged(const QString& oldName, const QString& newName); + void slotClear(); + void slotReportLoaded(); + void slotActivePageChanged(); + void slotBandAdded(LimeReport::PageDesignIntf*, LimeReport::BandDesignIntf*); + void slotBandDeleted(LimeReport::PageDesignIntf*, LimeReport::BandDesignIntf*item); + void slotItemAdded(LimeReport::PageDesignIntf*, LimeReport::BaseDesignIntf*); + void slotItemDeleted(LimeReport::PageDesignIntf*, LimeReport::BaseDesignIntf*item); + void slotObjectTreeItemSelectionChanged(); + void slotItemSelected(LimeReport::BaseDesignIntf* item); + void slotMultiItemSelected(); +private: + ReportDesignWidget* m_report; + QMainWindow* m_mainWindow; + QTreeWidget* m_treeView; + QMap m_itemsMap; + bool m_changingItemSelection; +}; + +} //namespace LimeReport +#endif // LROBJECTBROWSER_H diff --git a/src/report.qrc b/src/report.qrc new file mode 100644 index 0000000..8e711c0 --- /dev/null +++ b/src/report.qrc @@ -0,0 +1,158 @@ + + + images/pin_green.png + images/addBand.png + images/Control-Edit Box.png + images/disk_blue.png + images/folder.png + images/delete.png + images/document_add.png + images/document_zoom_in.png + images/document_zoom_out.png + images/prin-preview2.png + images/dialog-close.png + images/go-next.png + images/print2_big.png + images/next.png + images/prior.png + images/dialog-close_red.png + images/Hourglass_80.png + images/closebox.png + images/design.png + images/barcode.png + images/barcode2.png + images/edit_pecil2.png + images/undo1.png + images/redo1.png + images/copy24.png + images/edit-copy_1_24.png + images/edit-paste_1_24.png + images/cut24.png + images/save_as_1_24.png + images/move_top_1.png + images/move_back.png + images/bringToFront.png + images/sendToBack.png + images/to_left.png + images/to_right.png + images/to_center.png + images/to_same_width.png + images/to_same_height.png + images/to_top.png + images/cut_24.png + images/paste_1_24.png + images/to_bottom.png + images/to_h_center.png + images/folder1.png + images/document_add_1.png + images/zoom-in_2_16.png + images/document_zoom_in_1.png + images/document_zoom_out_1.png + images/prin-preview_4_24.png + images/print_2_24.png + images/hlayout.png + images/vlayout.png + images/edit_layout.png + images/layuot_move.png + images/hlayuot_1_24.png + images/layuot_select.png + images/layuot_create.png + images/layuot_create_24.png + images/layuot_select_24.png + images/layuot_delete_24.png + images/hlayuot_2_24.png + images/edit_layout_2_24.png + images/edit_control_24.png + images/edit_control_2_24.png + images/edit_layout_3_24.png + images/text_align_center.png + images/text-align-justify.png + images/text_align_left.png + images/text_align_right.png + images/text_bold.png + images/text_italic.png + images/text_underline.png + images/text-align-botom.png + images/text-align-top.png + images/text-align-v-center.png + images/allLines.png + images/bottomLine.png + images/leftLine.png + images/noLines.png + images/rightLine.png + images/topLine.png + images/new_leaf.png + images/save.png + images/copy.png + images/paste.png + images/cut.png + images/cut1.png + images/redo.png + images/undo.png + images/zoom_in.png + images/zoom_out.png + images/print.png + images/print_preview1.png + images/print_preview.png + images/print_preview2.png + images/allLines1.png + images/noLines1.png + images/leftLine1.png + images/bottomLine1.png + images/rightLine1.png + images/topLine1.png + images/toBack.png + images/toFront.png + images/toBottom.png + images/toCenter.png + images/toLeft1.png + images/toRight.png + images/toSameHeight.png + images/toSameWidth.png + images/toTop.png + images/toVCernter.png + images/text-align-botom1.png + images/text_align_center1.png + images/text-align-justify1.png + images/text_align_left1.png + images/text_align_right1.png + images/text-align-top1.png + images/text-align-v-center1.png + images/text_bold1.png + images/text_italic1.png + images/text_underline1.png + images/edit_control_3_24.png + images/edit_layout_4_24.png + images/hlayuot_3_24.png + images/addBand1.png + images/delete1.png + images/copy2.png + images/new_leaf1.png + images/paste1.png + images/zoom_in1.png + images/zoom_out1.png + images/folder3.png + images/dasabases.png + images/database.png + images/edit.png + images/table1.png + images/value.png + images/field.png + images/function2.png + images/function3.png + images/var1.png + images/variable.png + images/variable1.png + images/next1.png + images/prior1.png + images/next2.png + images/prior2.png + images/errors.png + images/main.png + images/first2.png + images/last2.png + images/logo.png + images/cpyright_logo.png + images/logo_100.png + + diff --git a/src/serializators/aserializatorintf.cpp b/src/serializators/aserializatorintf.cpp new file mode 100644 index 0000000..91eb6c9 --- /dev/null +++ b/src/serializators/aserializatorintf.cpp @@ -0,0 +1,30 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrserializatorintf.h" diff --git a/src/serializators/astorageintf.cpp b/src/serializators/astorageintf.cpp new file mode 100644 index 0000000..5812cf1 --- /dev/null +++ b/src/serializators/astorageintf.cpp @@ -0,0 +1,31 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "astorageintf.h" + diff --git a/src/serializators/lrserializatorintf.h b/src/serializators/lrserializatorintf.h new file mode 100644 index 0000000..ce6a44b --- /dev/null +++ b/src/serializators/lrserializatorintf.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSERIALIZATORINTF_H +#define LRSERIALIZATORINTF_H +#include +namespace LimeReport { + +class SerializatorIntf +{ +public: + virtual QVariant loadValue()=0; + virtual void save(const QVariant& value,QString name)=0; + virtual ~SerializatorIntf(){} +}; + +} +#endif // LRSERIALIZATORINTF_H diff --git a/src/serializators/lrstorageintf.h b/src/serializators/lrstorageintf.h new file mode 100644 index 0000000..c53982c --- /dev/null +++ b/src/serializators/lrstorageintf.h @@ -0,0 +1,72 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSTORAGEINTF_H +#define LRSTORAGEINTF_H + +#include + +class QString; +class QObject; + +namespace LimeReport{ + +class ObjectLoadingStateIntf{ +public: + virtual bool isLoading()=0; + virtual void objectLoadStarted()=0; + virtual void objectLoadFinished()=0; +}; + +class ItemsWriterIntf +{ +public: + virtual void putItem(QObject* item)=0; + virtual bool saveToFile(QString fileName) = 0; + virtual QString saveToString() = 0; + virtual ~ItemsWriterIntf(){} +}; + +class ItemsReaderIntf +{ +public: + typedef QSharedPointer Ptr; + virtual bool first()=0; + virtual bool next()=0; + virtual bool prior()=0; + virtual QString itemType()=0; + virtual QString itemClassName()=0; + virtual bool readItem(QObject *item)=0; + virtual int firstLevelItemsCount()=0; + virtual QString lastError()=0; + virtual ~ItemsReaderIntf(){} +}; + +} +#endif // LRSTORAGEINTF_H diff --git a/src/serializators/lrxmlbasetypesserializators.cpp b/src/serializators/lrxmlbasetypesserializators.cpp new file mode 100644 index 0000000..fcd2edf --- /dev/null +++ b/src/serializators/lrxmlbasetypesserializators.cpp @@ -0,0 +1,281 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrxmlbasetypesserializators.h" +#include "serializators/lrxmlserializatorsfactory.h" +#include "lrsimplecrypt.h" +#include +#include +#include + +namespace{ + +LimeReport::SerializatorIntf * createIntSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlIntSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createQRealSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlQRealSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createQStringSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlQStringSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createEnumAndFlagsSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlEnumAndFlagsSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createBoolSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlBoolSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createFontSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlFontSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createQSizeFSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlQSizeFSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createQImageSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlQImageSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createQColorSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlColorSerializator(doc,node); +} + +LimeReport::SerializatorIntf* createQByteArraySerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XmlQByteArraySerializator(doc,node); +} + +bool registredQString = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QString", createQStringSerializator); +bool registredInt = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("int", createIntSerializator); +bool registredEnumAndFlags = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("enumAndFlags",createEnumAndFlagsSerializator); +bool registredBool = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("bool", createBoolSerializator); +bool registredQFont = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QFont", createFontSerializator); +bool registredQSizeF = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QSizeF", createQSizeFSerializator); +bool registredQImage = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QImage", createQImageSerializator); +bool registredQReal = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("qreal", createQRealSerializator); +bool registerDouble = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("double", createQRealSerializator); +bool registerQColor = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QColor", createQColorSerializator); +bool registerQByteArray = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QByteArray", createQByteArraySerializator); + +} + + +namespace LimeReport{ + +void XmlBaseSerializator::saveBool(QDomElement node,QString name, bool value) +{ + if (value) node.setAttribute(name,1); + else node.setAttribute(name,0); +} + +void XmlQStringSerializator::save(const QVariant &value, QString name) +{ + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","QString"); + if (name.compare("password")==0){ + Chipper chipper; + QByteArray ba = chipper.cryptString(value.toString()); + //ba.append(); + _node.setAttribute("Value",QString(ba.toBase64())); + } else { + _node.appendChild(doc()->createTextNode(value.toString())); + } + node()->appendChild(_node); +} + +QVariant XmlQStringSerializator::loadValue() +{ + if (node()->tagName().compare("password")==0){ + QByteArray ba; + Chipper chipper; + ba.append(node()->attribute("Value").toLatin1()); + return chipper.decryptByteArray(QByteArray::fromBase64(ba)); + } else + return node()->text(); +} + +void XmlIntSerializator::save(const QVariant &value, QString name) +{ + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","int"); + _node.setAttribute("Value",value.toInt()); + node()->appendChild(_node); +} + +QVariant XmlIntSerializator::loadValue() +{ + return node()->attribute("Value").toInt(); +} + +void XmlEnumAndFlagsSerializator::save(const QVariant &value, QString name) +{ + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","enumAndFlags"); + _node.setAttribute("Value",value.toInt()); + node()->appendChild(_node); +} + +QVariant XmlEnumAndFlagsSerializator::loadValue() +{ + return node()->attribute("Value").toInt(); +} + +void XmlBoolSerializator::save(const QVariant &value, QString name) +{ + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","bool"); + if (value.toBool()) + _node.setAttribute("Value",1); + else _node.setAttribute("Value",0); + + node()->appendChild(_node); +} + +QVariant XmlBoolSerializator::loadValue() +{ + return node()->attribute("Value").toInt(); +} + +void XmlFontSerializator::save(const QVariant &value, QString name) +{ + + QFont font = value.value(); + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","QFont"); + _node.setAttribute("family",font.family()); + _node.setAttribute("pointSize",font.pointSize()); + saveBool(_node,"bold",font.bold()); + saveBool(_node,"italic",font.italic()); + saveBool(_node,"undeline",font.underline()); + + node()->appendChild(_node); +} + +QVariant XmlFontSerializator::loadValue() +{ + QFont font; + + font.setFamily(node()->attribute("family")); + font.setPointSize(node()->attribute("pointSize").toInt()); + font.setBold(node()->attribute("bold").toInt()); + font.setItalic(node()->attribute("italic").toInt()); + font.setUnderline(node()->attribute("underline").toInt()); + return font; +} + +void XmlQSizeFSerializator::save(const QVariant &value, QString name) +{ + QSizeF size = value.toSizeF(); + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","QSizeF"); + _node.setAttribute("width",QString::number(size.width())); + _node.setAttribute("height",QString::number(size.height())); + node()->appendChild(_node); +} + +QVariant XmlQSizeFSerializator::loadValue() +{ + QSizeF size; + size.setWidth(node()->attribute("width").toDouble()); + size.setHeight(node()->attribute("height").toDouble()); + return size; +} + +void XmlQImageSerializator::save(const QVariant &value, QString name) +{ + QImage image=value.value(); + QByteArray ba; + QBuffer buff(&ba); + buff.open(QIODevice::WriteOnly); + image.save(&buff,"PNG"); + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","QImage"); + _node.appendChild(doc()->createTextNode(ba.toHex())); + node()->appendChild(_node); +} + +QVariant XmlQImageSerializator::loadValue() +{ + QImage img; + img.loadFromData(QByteArray::fromHex(node()->text().toLatin1()),"PNG"); + return img; +} + +void XmlQRealSerializator::save(const QVariant &value, QString name) +{ + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","qreal"); + _node.setAttribute("Value",QString::number(value.toDouble())); + node()->appendChild(_node); +} + +QVariant XmlQRealSerializator::loadValue() +{ + return node()->attribute("Value").toDouble(); +} + +void XmlColorSerializator::save(const QVariant &value, QString name) +{ + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","QColor"); + _node.setAttribute("Value",value.value().name()); + node()->appendChild(_node); +} + +QVariant XmlColorSerializator::loadValue() +{ + return QColor(node()->attribute("Value")); +} + +void XmlQByteArraySerializator::save(const QVariant &value, QString name) +{ + QDomElement _node = doc()->createElement(name); + _node.setAttribute("Type","QByteArray"); + _node.setAttribute("Value",QString(value.toByteArray().toBase64())); + node()->appendChild(_node); +} + +QVariant XmlQByteArraySerializator::loadValue() +{ + QByteArray ba; + ba.append(node()->attribute("Value").toLatin1()); + return QByteArray::fromBase64(ba); +} + + + +} + + + diff --git a/src/serializators/lrxmlbasetypesserializators.h b/src/serializators/lrxmlbasetypesserializators.h new file mode 100644 index 0000000..18dfb81 --- /dev/null +++ b/src/serializators/lrxmlbasetypesserializators.h @@ -0,0 +1,141 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRXMLBASETYPESSERIALIZATORS_H +#define LRXMLBASETYPESSERIALIZATORS_H + +#include "lrserializatorintf.h" +#include +#include + +namespace LimeReport{ + +class XmlBaseSerializator : public SerializatorIntf{ +public: + XmlBaseSerializator(QDomDocument *doc, QDomElement *node):m_doc(doc),m_node(node){} +protected: + QDomDocument* doc() {return m_doc;} + QDomElement* node() {if (!m_node) qDebug()<. * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrxmlqrectserializator.h" +#include "lrserializatorintf.h" +#include "lrxmlserializatorsfactory.h" + +#include +#include + +namespace{ + +LimeReport::SerializatorIntf * createQRectSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XMLQRectSerializator(doc,node); +} + +LimeReport::SerializatorIntf * createQRectFSerializator(QDomDocument *doc, QDomElement *node){ + return new LimeReport::XMLQRectFSerializator(doc,node); +} + +bool registredQRect = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QRect", createQRectSerializator); +bool registredQRectF = LimeReport::XMLAbstractSerializatorFactory::instance().registerCreator("QRectF", createQRectSerializator); + +} + +QVariant LimeReport::XMLQRectSerializator::loadValue() +{ + QRect rect; + //QDomElement geometryNode = m_node->firstChildElement(name); + //if (!geometryNode.isNull()){ + rect = QRect( + m_node->attribute("x").toInt(), + m_node->attribute("y").toInt(), + m_node->attribute("width").toInt(), + m_node->attribute("height").toInt() + ); + //} + return rect; +} + +void LimeReport::XMLQRectSerializator::save(const QVariant &value, QString name) +{ + QDomElement geometryNode = m_doc->createElement(name); + geometryNode.setAttribute("Type","QRect"); + geometryNode.setAttribute("x",value.toRect().x()); + geometryNode.setAttribute("x",value.toRect().x()); + geometryNode.setAttribute("y",value.toRect().y()); + geometryNode.setAttribute("width",value.toRect().width()); + geometryNode.setAttribute("height",value.toRect().height()); + m_node->appendChild(geometryNode); +} + +void LimeReport::XMLQRectFSerializator::save(const QVariant &value, QString name) +{ + QDomElement geometryNode = m_doc->createElement(name); + geometryNode.setAttribute("Type","QRectF"); + geometryNode.setAttribute("x",value.toRect().x()); + geometryNode.setAttribute("y",value.toRect().y()); + geometryNode.setAttribute("width",value.toRect().width()); + geometryNode.setAttribute("height",value.toRect().height()); + m_node->appendChild(geometryNode); +} + +QVariant LimeReport::XMLQRectFSerializator::loadValue() +{ + QRectF rect; + //QDomElement geometryNode = m_node->firstChildElement(name); + //if (!geometryNode.isNull()){ + rect = QRect( + m_node->attribute("x").toDouble(), + m_node->attribute("y").toDouble(), + m_node->attribute("width").toDouble(), + m_node->attribute("height").toDouble() + ); + + //} + return rect; +} diff --git a/src/serializators/lrxmlqrectserializator.h b/src/serializators/lrxmlqrectserializator.h new file mode 100644 index 0000000..cc26275 --- /dev/null +++ b/src/serializators/lrxmlqrectserializator.h @@ -0,0 +1,61 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRXMLQRECTSERIALIZATOR_H +#define LRXMLQRECTSERIALIZATOR_H + +#include "lrserializatorintf.h" +#include + +namespace LimeReport{ + +class XMLQRectSerializator : public SerializatorIntf +{ +public: + XMLQRectSerializator(QDomDocument *doc, QDomElement *node):m_doc(doc),m_node(node){} + virtual void save(const QVariant &value,QString name); + virtual QVariant loadValue(); +private: + QDomDocument *m_doc; + QDomElement *m_node; +}; + +class XMLQRectFSerializator : public SerializatorIntf +{ +public: + XMLQRectFSerializator(QDomDocument *doc, QDomElement *node):m_doc(doc),m_node(node){} + virtual void save(const QVariant &value, QString name); + virtual QVariant loadValue(); +private: + QDomDocument *m_doc; + QDomElement *m_node; +}; + +} +#endif // LRXMLQRECTSERIALIZATOR_H diff --git a/src/serializators/lrxmlreader.cpp b/src/serializators/lrxmlreader.cpp new file mode 100644 index 0000000..4f2f282 --- /dev/null +++ b/src/serializators/lrxmlreader.cpp @@ -0,0 +1,228 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "stdexcept" + +#include "lrxmlreader.h" +#include "lrbasedesignintf.h" +#include "lrdesignelementsfactory.h" +#include "lrcollection.h" + +#include + +namespace LimeReport{ + +XMLReader::XMLReader() + : m_doc(new QDomDocument){} +XMLReader::XMLReader(QSharedPointer doc) + : m_doc(doc){} + +bool XMLReader::prepareReader(QDomDocument* doc) +{ + Q_UNUSED(doc); + m_error=QLatin1String("Context not initialized"); + return false; +} + +int XMLReader::firstLevelItemsCount() +{ + if (m_firstNode.childNodes().count()==0) return 0; + QDomElement tmpNode = m_firstNode; + int res=0; + while (!tmpNode.isNull()){ + res++; + tmpNode=tmpNode.nextSiblingElement(); + } + return res; +} + +bool XMLReader::first() +{ + if (extractFirstNode()){ + m_curNode = m_firstNode; + return !m_curNode.isNull(); + } + return false; +} + +bool XMLReader::next() +{ + m_curNode = m_curNode.nextSiblingElement(); + return !m_curNode.isNull(); +} + +bool XMLReader::prior() +{ + m_curNode = m_curNode.previousSiblingElement(); + return !m_curNode.isNull(); +} + +QString XMLReader::itemType() +{ + return m_curNode.attribute("Type"); +} + +QString XMLReader::itemClassName() +{ + return m_curNode.attribute("ClassName"); +} + +bool XMLReader::readItem(QObject *item) +{ + if (!m_curNode.isNull()){ + readItemFromNode(item,&m_curNode); + } else { + m_error=QString("Object %1 not founded").arg(item->objectName()); + return false; + } + return true; +} + +void XMLReader::readItemFromNode(QObject* item,QDomElement *node) +{ + + ObjectLoadingStateIntf* lf = dynamic_cast(item); + if(lf) lf->objectLoadStarted(); + for (int i=0;ichildNodes().count();i++){ + QDomElement currentNode =node->childNodes().at(i).toElement(); + if (currentNode.attribute("Type")=="Object"){ + readQObject(item,¤tNode); + }else if (currentNode.attribute("Type")=="Collection") + { + readCollection(item,¤tNode); + } + else readProperty(item,¤tNode); + } + if (lf) lf->objectLoadFinished(); + + BaseDesignIntf* baseObj = dynamic_cast(item); + if(baseObj) { + foreach(QGraphicsItem* item,baseObj->childItems()){ + BaseDesignIntf* baseItem = dynamic_cast(item); + if (baseItem) baseItem->parentObjectLoadFinished(); + } + } +} + +QString XMLReader::lastError() +{ + return m_error; +} + +bool XMLReader::extractFirstNode() +{ + if (m_firstNode.isNull()){ + if (m_doc->childNodes().count()==0){ + if (!prepareReader(m_doc.data())) return false; + } + m_firstNode = m_doc->documentElement(); + if (!m_firstNode.hasAttributes()) + m_firstNode = m_firstNode.firstChildElement(); + } + return !m_firstNode.isNull(); +} + +void XMLReader::readProperty(QObject *item, QDomElement *node) +{ + item->setProperty(node->nodeName().toLatin1(),getValue(node)); +} + +QVariant XMLReader::getValue(QDomElement *node) +{ + CreateSerializator creator = 0; + try { + creator=XMLAbstractSerializatorFactory::instance().objectCreator( + node->attribute("Type") + ); + } catch(ReportError &e){ + qDebug()<attribute("Type")<serializator(creator(m_doc.data(),node)); + return serializator->loadValue(); + } + return QVariant(); +} + +void XMLReader::readQObject(QObject* item, QDomElement* node) +{ + QObject* childItem = qvariant_cast(item->property(node->nodeName().toLatin1())); + if (childItem) + readItemFromNode(childItem,node); +} + +void XMLReader::readCollection(QObject *item, QDomElement *node) +{ + ICollectionContainer* collection = dynamic_cast(item); + if (collection){ + QString collectionName = node->nodeName(); + for(int i=0;ichildNodes().count();i++){ + QDomElement currentNode =node->childNodes().at(i).toElement(); + QObject* obj = collection->createElement(collectionName,currentNode.attribute("ClassName")); + if (obj) + readItemFromNode(obj,¤tNode); + } + collection->collectionLoadFinished(collectionName); + } +} + +FileXMLReader::FileXMLReader(QString fileName) + : m_fileName(fileName) +{ +} + +bool FileXMLReader::prepareReader(QDomDocument *doc) +{ + if (!m_fileName.isEmpty()){ + QFile source(m_fileName); + if (source.open(QFile::ReadOnly)) { + doc->setContent(&source); + } else {m_error=QString(QObject::tr("File %1 not opened")).arg(m_fileName); return false;} + } + return true; +} + +bool StringXMLreader::prepareReader(QDomDocument *doc) +{ + if (!m_content.isEmpty()){ + doc->setContent(m_content); + }else {m_error = QString(QObject::tr("Content string is empty")); return false;} + return true; +} + +bool ByteArrayXMLReader::prepareReader(QDomDocument *doc) +{ + if (m_content){ + doc->setContent(*m_content); + } else {m_error = QString(QObject::tr("Content is empty")); return false;} + return true; +} + +} diff --git a/src/serializators/lrxmlreader.h b/src/serializators/lrxmlreader.h new file mode 100644 index 0000000..f677c68 --- /dev/null +++ b/src/serializators/lrxmlreader.h @@ -0,0 +1,104 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRXMLREADER_H +#define LRXMLREADER_H + +#include +#include + +#include "serializators/lrxmlwriter.h" +#include "lrdesignelementsfactory.h" + +namespace LimeReport{ + +class XMLReader : public ItemsReaderIntf +{ +public: + XMLReader(); + XMLReader(QSharedPointer doc); +protected: + + virtual bool first(); + virtual bool next(); + virtual bool prior(); + virtual QString itemType(); + virtual QString itemClassName(); + virtual bool readItem(QObject *item); + virtual int firstLevelItemsCount(); + virtual bool prepareReader(QDomDocument *doc); + + void readItemFromNode(QObject *item, QDomElement *node); + void readProperty(QObject *item, QDomElement *node); + void readQObject(QObject *item, QDomElement *node); + void readCollection(QObject *item, QDomElement *node); + QVariant getValue(QDomElement *node); + + virtual QString lastError(); +protected: + bool extractFirstNode(); + QString m_error; +private: + QSharedPointer m_doc; + QDomElement m_curNode; + QDomElement m_firstNode; +}; + +class FileXMLReader : public XMLReader{ +public: + static ItemsReaderIntf::Ptr create(QString fileName){ return ItemsReaderIntf::Ptr(new FileXMLReader(fileName));} +protected: + virtual bool prepareReader(QDomDocument *doc); +private: + FileXMLReader(QString fileName); + QString m_fileName; +}; + +class StringXMLreader : public XMLReader{ +public: + static ItemsReaderIntf::Ptr create(QString content){ return ItemsReaderIntf::Ptr(new StringXMLreader(content));} +protected: + virtual bool prepareReader(QDomDocument *doc); +private: + StringXMLreader(QString content) : m_content(content){} + QString m_content; +}; + +class ByteArrayXMLReader : public XMLReader{ +public: + static ItemsReaderIntf::Ptr create(QByteArray* content){ return ItemsReaderIntf::Ptr(new ByteArrayXMLReader(content));} +protected: + virtual bool prepareReader(QDomDocument *doc); +private: + ByteArrayXMLReader(QByteArray* content): m_content(content){} + QByteArray* m_content; +}; + +} +#endif // LRXMLREADER_H diff --git a/src/serializators/lrxmlserializatorsfactory.h b/src/serializators/lrxmlserializatorsfactory.h new file mode 100644 index 0000000..5d76e06 --- /dev/null +++ b/src/serializators/lrxmlserializatorsfactory.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRXMLABSTRACTSERIALIZATORFABRIC_H +#define LRXMLABSTRACTSERIALIZATORFABRIC_H + +#include "lrserializatorintf.h" +#include "lrsimpleabstractfactory.h" + +#include + +namespace LimeReport{ + +typedef SerializatorIntf* (*CreateSerializator)(QDomDocument *doc, QDomElement *parentNode); + +class XMLAbstractSerializatorFactory: public SimpleAbstractFactory +{ +private: + friend class Singleton; +public: + XMLAbstractSerializatorFactory(){} + ~XMLAbstractSerializatorFactory(){} + XMLAbstractSerializatorFactory(const XMLAbstractSerializatorFactory&){} + XMLAbstractSerializatorFactory& operator = (const XMLAbstractSerializatorFactory&){return *this;} +}; + +} + +#endif // LRXMLABSTRACTSERIALIZATORFABRIC_H diff --git a/src/serializators/lrxmlwriter.cpp b/src/serializators/lrxmlwriter.cpp new file mode 100644 index 0000000..84beaee --- /dev/null +++ b/src/serializators/lrxmlwriter.cpp @@ -0,0 +1,222 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrxmlwriter.h" +#include "lrbasedesignintf.h" +#include "serializators/lrxmlserializatorsfactory.h" +#include "lrcollection.h" +#include + +namespace LimeReport{ + +XMLWriter::XMLWriter() : m_doc(new QDomDocument) +{ + m_rootElement=m_doc->createElement("Report"); + m_doc->appendChild(m_rootElement); +} + +XMLWriter::XMLWriter(QSharedPointer doc) : m_doc(doc){ + m_rootElement=m_doc->createElement("Report"); + m_doc->appendChild(m_rootElement); +} + +void XMLWriter::putItem(QObject *item) +{ + QDomElement node=putQObjectItem(item->metaObject()->className(),item); + if (!replaceNode(node,item)) m_rootElement.appendChild(node); +} + +QString XMLWriter::extractClassName(QObject *item) +{ + BaseDesignIntf* baseItem = dynamic_cast(item); + if(baseItem) return baseItem->storageTypeName(); + else return item->metaObject()->className(); +} + +void XMLWriter::putChildQObjectItem(QString name, QObject *item, QDomElement *parentNode) +{ + QDomElement itemNode = m_doc->createElement(name); + itemNode.setAttribute("ClassName",extractClassName(item)); + itemNode.setAttribute("Type","Object"); + if (parentNode) parentNode->appendChild(itemNode); + saveProperties(item,&itemNode); +} + +bool XMLWriter::setContent(QString fileName) +{ + QFile xmlFile(fileName); + if (xmlFile.open(QFile::ReadOnly)){ + return m_doc->setContent(&xmlFile); + } + return false; +} + +bool XMLWriter::saveToFile(QString fileName) +{ + if ((m_doc->childNodes().count()==0)||fileName.isEmpty()) return false; + QFile xmlFile(fileName); + if (xmlFile.open(QFile::WriteOnly)) { + QTextStream buffer(&xmlFile); + m_doc->save(buffer,2); + xmlFile.close(); + return true; + } + return false; +} + +QString XMLWriter::saveToString() +{ + QString res; + QTextStream buffer(&res); + m_doc->save(buffer,2); + return res; +} + +QDomElement XMLWriter::putQObjectItem(QString name, QObject *item) +{ + Q_UNUSED(name) + QDomElement itemNode = m_doc->createElement("object"); + itemNode.setAttribute("ClassName",extractClassName(item)); + itemNode.setAttribute("Type","Object"); + saveProperties(item,&itemNode); + return itemNode; +} + +void XMLWriter::saveProperty(QString name, QObject* item, QDomElement *node) +{ + CreateSerializator creator=0; + + if (isCollection(name,item)) { saveCollection(name,item,node); return;} + if (isQObject(name,item)) { + if (qvariant_cast(item->property(name.toLatin1()))) + putQObjectProperty(name,qvariant_cast(item->property(name.toLatin1())),node); + else { + qDebug()<<"Warnig property can`t be casted to QObject"<property(name.toLatin1()).typeName() + ); + } catch (LimeReport::ReportError &exception){ + qDebug()<<"class name ="<metaObject()->className() + <<"property name="<elementsCount(propertyName);i++){ + putCollectionItem(collection->elementAt(propertyName,i),&collectionNode); + } + + node->appendChild(collectionNode); +} + +bool XMLWriter::isQObject(QString propertyName, QObject *item) +{ + QMetaProperty prop=item->metaObject()->property(item->metaObject()->indexOfProperty(propertyName.toLatin1())); + return QMetaType::type(prop.typeName())==QMetaType::QObjectStar; +} + +bool XMLWriter::replaceNode(QDomElement node, QObject* item) +{ + QDomElement element = m_rootElement.firstChildElement(item->metaObject()->className()); + while (!element.isNull()){ + QDomElement objectName = element.firstChildElement(QLatin1String("objectName")); + if (!objectName.isNull()&&(objectName.text()==item->objectName())){ + QDomElement removeElement=element; + element=element.nextSiblingElement(item->metaObject()->className()); + m_rootElement.replaceChild(node,removeElement); + return true; + } + else element=element.nextSiblingElement(item->metaObject()->className()); + } + return false; +} + +void XMLWriter::putCollectionItem(QObject *item, QDomElement *parentNode) +{ + putChildQObjectItem("item",item,parentNode); +} + +void XMLWriter::putQObjectProperty(QString propertyName, QObject* item, QDomElement* parentNode) +{ + putChildQObjectItem(propertyName,item,parentNode); +} + +} + + + + + + + + diff --git a/src/serializators/lrxmlwriter.h b/src/serializators/lrxmlwriter.h new file mode 100644 index 0000000..9a814d6 --- /dev/null +++ b/src/serializators/lrxmlwriter.h @@ -0,0 +1,71 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRXMLWRITER_H +#define LRXMLWRITER_H + +#include +#include "serializators/lrstorageintf.h" +#include "serializators/lrxmlserializatorsfactory.h" +#include "lrbasedesignintf.h" + +namespace LimeReport{ + +class XMLWriter : public ItemsWriterIntf +{ +public: + XMLWriter(); + XMLWriter(QSharedPointer doc); + ~XMLWriter() {} +private: + virtual void putItem(QObject* item); + virtual bool saveToFile(QString fileName); + virtual QString saveToString(); + QDomElement putQObjectItem(QString name, QObject* item); + void putChildQObjectItem(QString name, QObject* item, QDomElement* parentNode); + void putCollectionItem(QObject* item, QDomElement* parentNode=0); + void putQObjectProperty(QString propertyName, QObject *item, QDomElement* parentNode=0); + void saveProperties(QObject* item, QDomElement* node); + bool setContent(QString fileName); + void saveProperty(QString name, QObject* item, QDomElement* node); + bool enumOrFlag(QString name, QObject* item); + QString extractClassName(QObject* item); + bool isCollection(QString propertyName, QObject *item); + void saveCollection(QString propertyName, QObject *item, QDomElement *node); + bool isQObject(QString propertyName, QObject *item); + bool replaceNode(QDomElement node, QObject *item); +private: + QSharedPointer m_doc; + QString m_fileName; + QDomElement m_rootElement; +}; + +} + +#endif // LRXMLWRITER_H diff --git a/src/waitform.cpp b/src/waitform.cpp new file mode 100644 index 0000000..f359918 --- /dev/null +++ b/src/waitform.cpp @@ -0,0 +1,44 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "waitform.h" +#include "ui_waitform.h" +#include + +WaitForm::WaitForm(QWidget *parent) : + QDialog(parent), + ui(new Ui::WaitForm) +{ + ui->setupUi(this); +} + +WaitForm::~WaitForm() +{ + delete ui; +} diff --git a/src/waitform.h b/src/waitform.h new file mode 100644 index 0000000..658ce3b --- /dev/null +++ b/src/waitform.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef WAITFORM_H +#define WAITFORM_H + +#include + +namespace Ui { +class WaitForm; +} + +class WaitForm : public QDialog +{ + Q_OBJECT + +public: + explicit WaitForm(QWidget *parent = 0); + ~WaitForm(); + +private: + Ui::WaitForm *ui; +}; + +#endif // WAITFORM_H diff --git a/src/waitform.ui b/src/waitform.ui new file mode 100644 index 0000000..4549ef8 --- /dev/null +++ b/src/waitform.ui @@ -0,0 +1,58 @@ + + + WaitForm + + + + 0 + 0 + 186 + 95 + + + + + 0 + 0 + + + + Wait + + + false + + + + + + + 0 + 0 + + + + + + + :/report/images/hourglass + + + true + + + + + + + Please wait ... + + + + + + + + + +

@b;yiN#Qg+@sTo+~bq4#hwz z9x38jMOEqOsZ+;I8)hmpcS~R2o}UteMU@D<-l0_g-=F>Lr9I^euOg3u48uOD>smu4 q!mf81rouBwI5;>sI5;@e1^*Anwu=*vi~p$r0000&ew?}I z{N|oB=iX~nmH)GZodoBEqchHJir75eJu)hVDm0Ph_u zo5H380~iBAqc$cR3mWafn5}or*89dl#bmm=c7b=6$ijxzobrGzqd{}bD3yS_`pqYs z;GOLrz}ak)D%mF~2w6K&5SoIf&&cRv! zOMv2AGK3*cg)nsjs%Q&&y5p7I|uPf}2Y>bK}*4Dv4D>=Y-|egxl-+4Wl-Af}@8{l(z3*S<3fE_gkD3!q^Il zRjl9JgUM<Vqn(+LPKhW(0ZjFc@kH2fr?@R zvnv4g$YZ^BUV)Eizb@6_tCPz}v%ojUIKWhN$3>K#u+o$iLOpT1feKx&2Q z>1n!Jfp&?h*Rq|iJ#oQyx;kIYM9+M5{+H5j$DIWK0blUJP^UaI&;S4c07*qoM6N<$ Ef*X>yCIA2c literal 0 HcmV?d00001 diff --git a/src/images/print_2_24.png b/src/images/print_2_24.png new file mode 100644 index 0000000000000000000000000000000000000000..aeec91f6278a196aca17dd8c13c4853eacf8bfcc GIT binary patch literal 912 zcmV;B18@9^P)uBMn+ALVPB}`Lmbfl{h#Kfy;FcebUgA(ARQUBfH8s*!HQyyl9}P00V_h8 zlrlJ`0)lguLlhK2fh2%dP7(x?R$l`oz$hu{PHZ!4^dSZ`u;q~_(=vy34R7ZzaO2o8ESH5EKo<6X#}hsU$~g6Wl8Dx<0&7>>gwtT zF_y235CPqG2aRpF*i_BWjz>B1Iqpm3>0-Zowf4jwAgbhfo_!;0Yu~%&$H%5uPN?-93OxN|hVzP{$O5Mu<2q$MJTG{|_c^89CnB7&+?tIg?+>(9!y=2cQk=NdQ0(B0mq-MO!-Dj|e% zK%Vt_z0Wo_HeLfFK>y&Nar4%##`DW7*m@I9Q+99Q%KjE&zLjqG;a;cH*&BJREX(gE zGhRRa_@j5Pzx?Khm##d6CY_qis)|@4?Ek@o^)KJQ^Y%OMjaNl8`6@0h)}x)T&t!b$ ze;p`xzD{GY?j~Q@Q? myNJwP?59N!)fV?AhyMfLpR!yZ(Ip%J0000JP)J~h<~F6Z*h)27f`VC`6cNQOi0I&^i?}*wcIY>d;@}r> zP_jwrA_1il1xv9M{}4#qXiS?l&Ar|~Imac5jix&2yPb1>zlZm{yzq|_hY#6Yx&SNy z$s^`VKr_Fzer4!uHkaO1e^EA<-aNdc|H4Q%oG(MX4bJ=tK*OzqQXm8cJoW?sh)%Q>1(EG?{#RDUFK&`axQfhLpNA? z_k?O_3o{iYFsk(c=GwD50KFU2w?&8@UGB>8l+?>X<)bAmBmP8=f{o2Gf z6i!g#jcIrW7>0{d@cHFFnl6}4NBV%CgSvAd5kfFCHHR5VFd0b@izGkXIV-mn>*J2qsI?pN7T3u?D9YL1IYdAEkg}X QW&i*H07*qoM6N<$f*27RApigX literal 0 HcmV?d00001 diff --git a/src/images/print_preview1.png b/src/images/print_preview1.png new file mode 100644 index 0000000000000000000000000000000000000000..7fc0d31ce4717128f4ff70812ab475be7600be15 GIT binary patch literal 683 zcmV;c0#yBpP)CAOOs9@^XvwD+zbMARhj^YPAGeC;w%mdrw zV~fL0rz4~3to((M(RB7;UvHw3D%NuQFU9Xj{YikLZGi|V1p+7mQHTPC9NATetplxq zsrl5;iGb%yvpWS~^RR=~-rKEaamArhv~fKb5PX_W%nTAw`VkS7YTPt4FAGP$U~YV> zQMc<{>A6Pw)F1&p$or)!J}k{*S3DA(erBJq12A~+1c2EPh$j5tD*Db{4Lg94`_M?(xmbb@*aztciKS0L=SiG@7upl~66legXkn=4f+ zMF&k+oJ_|6&>CqfT&4M_ITd=6{g}paOrxEIag1d9d7{AF)cn1y&4FONY zv1>IcS4-?VMZ(b_kyr%7h@k>?Do%;c(_L)U))5b^&!qyetOGoFI*=5h(~-ve?*L0bqP=u?;}K|70NLdAtflHAnNYP}us`msy)pZ7m&? z_cmFu*7#z5q`!NJ{_Y|2)zyOzG(wyS8k%Ny1?F5^BGqkAt>&`wbt9{U{Sxiw>rAaq zGc`HgD9~X6g+g3M!d9kwUDMUOXAkEG`A0P1kzMk3a+%r<&8J?wj@;ru_yJw$44EhA Rj_&{f002ovPDHLkV1frhE|mZP literal 0 HcmV?d00001 diff --git a/src/images/print_preview2.png b/src/images/print_preview2.png new file mode 100644 index 0000000000000000000000000000000000000000..f196c4319b48e99efc0bcac6e623997c588d87e1 GIT binary patch literal 735 zcmV<50wDc~P)W+o11B(^S^Y)So$Vj>hBdIF3blX@bwQ@6o&(WyigL5={)R0MOD~#mwtCYX4C4 zb>MD&u$_*Et2mhqb|y`6UI4Gh$69=etR)dDWE}|B`U!^oxDLc3X*4Ni3y?f}tkb_` zCWz|>TPcI2l|ZwK@CYAC-6Z-Y1%RRo6ipBe6>eWasy;2>@p|&?M0(Ymwv*IWH!vTa zA>Zex&1Ovvth1NSmH;sB^haP zC=jHxtqUmyacddr!pdwy2NpCT7(t4AlaaAV_vzlnwQtd`Eyp0T{GDZEfz4E$WIDm~ zu}65-d^+2@0T>+&mjkF%FMlpJTso|+Czh^6WAoB>tP(S8D63mPh{Wco3|1gi*s#`V ztZyW%+Kf-W)4zWB^>EiC^*?Rya$R>As1$&7bM3;Qf>0nGm)J=cJ!0xWY;-Vu^5Aa= z`i7b&+>C6lI+gd002ovPDHLkV1fl0LHhsz literal 0 HcmV?d00001 diff --git a/src/images/prior.png b/src/images/prior.png new file mode 100644 index 0000000000000000000000000000000000000000..275b99a7143f8fd54c350f1fbf4f69e149e8b0f6 GIT binary patch literal 1321 zcmV+^1=jkBP)+ZV#7sD6-C9H%9WhfYe z(Sww=m>9Ge83Ykj6g?yqCT0*RBH{)b^iUB+^q}-&1wkrgf>BGgL6Ytot?jJN?45hg zJw43bb+S7;u82S8%kSPZ=bqo^{LZ=Ocg1_poiuevqXTB*V%Dr#_w@EY)?X|Z?d=Sh zI45U+Jp1XfV_&}Y9{^)a`}U`wTDf9H&+Uv)wOZxLzHKKb?r&)cMn*<%8OUTcUKpzo zCD(s&tX$^JU3=KQduL05LIrc%+gbw{sU?j1%)bDLYY}hk+Q)F&aXxM>i5+5@o6(*b zrKkkuUFJaEdv@;KM|H_+iUTLCOALVomd$bwC~Y_%lAdAgo!tg2aO~>6c}4GZ{Evt}t}XEbJ{xZP6&yTZwLofM26Q^v89@;`} zVusfalFs zLC!NLuUiKwg*i$gl*?saeYYQf-^0x9C}O8jw?rvs6!UZ!3#|i0)^cg=3eUa%Hoq@k z$BJ3grxYAO5Js!xjE&c5&*xeL7^&2Fe$N3;&t65(UGs4OQv^tqFgPx>U8%9WRRHiP z60CRpaIuUqxu+0>^q1bJUZml=-Yy6lAaO{O*ERDTozvdN;T(&y>t<7{TeH`OpF4jv|q>oEj>_#2Jtt7FngY zq&!P!w6_M3h)`1+?>&i6>N7}E?-Mp{?c>P7{Y0+DSZomylqf_Al6oal2TNg`WPj~v z0?f!83KEkf3D#Piwb;aBt;ITrbCzc}Kgyv){d8AG(Ar>(MjL}M2BYd;YmHL%RStCa zp_~0pmEctjLM#Boeu0;-iNNtgij^c$^7CYS5R6>Jh9j^oOa z!|$J&);TRs9~S4FIOoJ#E7n>S$5yPh;+$3WAc#`RYps0{n8X<4jhXabYwbnEH)g;& zC!?dI!xQ(?NGT#g1DpW5K|u;^8rlF7zyUE}8{|@DrNR0%ury0kN-e2WDrxW&)AFg3 fRKCIc8!f}XR0$aTm-#MM7q{oq#T zSL&KOelYsA)&wk^EdL~&t|h89 zPguYxHcO%N07GTV+atTm%owIS@Wv=HG4ElKH@GL~_4k@1gWTNb+)@u%a`uU?sXke^ zN`Y12b>H3;_7df=AJTjE_zr~aywg#dp3CRsQXu^LU8hl}_eMXp{!Q0UPThZ=*__29 UOq2D26%)_kz4*#1`Hx4kzb8J=~OWv!gMtM-+2v_XMZ z*3JbD-zRyt^VP7}B*ZPu2(AzgN!YYtR>tKIA|?;wY!VjvCjMcZmlAkII^pkDg@^-T3G%na_8+;EV`TF`{g-vQ-D!K)ect73 Qfv#onboFyt=akR{05KqC_y7O^ literal 0 HcmV?d00001 diff --git a/src/images/redo.png b/src/images/redo.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5e77342b8085283de73e33a3b841ffa266ba73 GIT binary patch literal 733 zcmV<30wVp1P)IDD*0%}P_ zK~y-)#gk7+6k!;~pZA;DS!dZ@*WEQsL}J4<1T%@KLtD^6A_!WD2t0HMJO&YH*E&>( zZXK#a6h?LrL$+1CHFf1lGLo8Ju)a)H{nE#o z%BQIv`mUMLrTb6!oo&l*LA6r{3)9>e9h(OSLv}X4^p^a6i*hhtDM_O2fO&d#gvj`=nJK~n!6kU$8h9;wGwFhSJi zC9M@pFuV$_2PWLGMs?vrQJ7?P!`B0ss{mkruU&qSe^~~A=YnYCbc1_^w;=2c5Eyz~SJ&K)aE=rLWeD#j%xpf7_3kp3$=Ztc`yFoY^iq38yIa P00000NkvXXu0mjf&tpIr literal 0 HcmV?d00001 diff --git a/src/images/redo1.png b/src/images/redo1.png new file mode 100644 index 0000000000000000000000000000000000000000..89d51fbcba232b40b9ea006b7130c2d4ddce67c8 GIT binary patch literal 1155 zcmV-}1bq96P)1vj-Se08lau~vND~vaYOTFEtthrw+Y5VDwN;^)wp2wCghupE`s1aDRusIk zt)d8mB?YN1h$dC6XrZQHD7H;W3^X=1$tLIQ*|R%4GhXx@o0BvkLSJ|pnAv&X`Mz)V z+ZEPYZYAU`Rc{ywAr|HTfe?aCZ~T}6a2I=M{hooIm7V$RuYWwWZFN_Hv?~}M_ZgoK zP7VE8KK8>qj}6Y>(@6KDubo;`nJVuEb_i>2(@7tG<=bLsN8!CA|ZW@?tvY~gN=Y_|620lDGR5*Kh>yjpe2VXoGPAl zPd(J$KUp)S=}L5?9*qdrzkG66HkUp!?FEG8D%KjLln6&6>Z6nr={jWdX>$2Ajw6vm zu(msoqqR2~+2Y8x0Ape7@&rv0WV6YA*Cu9(gAfzP2q{Uoq{tQ0NJla|8=|y<7%DRX zVW7wtTSz1vejWDcTAC@2P1dkjnDc7601xc=s#NvE9;0GZP(w(E&h91TT3e2dj!vD+ zW>a)_wQaN3mabfxLB*OVw0M(cvV|6sDVNJv{W-U3o`Kc66a|X77GbqzX?vd8a@hOb z!7T^plxTlx=hvH8t-7smY|JZG1BF(W^0ZI3wFNifTo<2bAOTXDWRKPwtrXT6(z(pY znL|&^6$fDO(@6sPvdv9;gW3|C*gNb8ms#DZ;wCjPb`UJaSp3OJ(z!zS&BRx2`=Z#sqV34Y z@I+B-i;x0@1uL;eV2uK65%NY4l>nDc?i?}33}Q6KD720@&lkUU>u1HK?XCUZRHYQv z6h>=|Hg#&O))=jc!w4OzW&?o8ue_fsWB^dLO3&R}4mFvyF3TS&Py3~c=l`4g20>sN z_0R^b;)Mnmzj^)>6RUwlI*tGL6;g%FzQ)?R-N%p5PWcau}cEJZ{?B~56u%&Cmo4c*i&tddB zU=+v#nL3kogBYj*0Z;|}I;-`$Xh8(?AnT`X(5=rkHrP2)%%!QXT~E=i#4Z1;_y=gM VKbw3>=VSl?002ovPDHLkV1m#9E6D%= literal 0 HcmV?d00001 diff --git a/src/images/redo_1_16.png b/src/images/redo_1_16.png new file mode 100644 index 0000000000000000000000000000000000000000..17f7ac077b1504a66821b02da01eb4cc6a6d7a99 GIT binary patch literal 875 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4(FKU^en}aSW-Lla!#qV{zv7jQ_?4 z1_cR|S%3=u|4&jn#K0)$=*Bj^Q|JChNhYwM(lG|UygD^D`^yq+{WI4{v;jpyYF&cQ z-%@P8x^%?d>JL-Mx2WgX%wXb!O(n{A@q~ z(c2_>AY;l&-NT9}0v4}RovWm*bzJ3;_PGN`&mBH+;79vI`NR2b_W$dR{`~zv`Qh>T z@;t}o-=;>$vl&92*(i13)VbpU`B|$buhCj~^uVc8M-H6$G5?|cWq&rdWA;4%CF_h0 zjQ*r0B>Xsg;LxAh2YpWVG$tNi`TjL?T`|O0EC=`UIT%Q^U3|W{J3{4*lG*OxnQzv` z9#Z&wao@Q@hu!n{#&7>PV>xT&k`o);I($}$FTAH>o3d9#>7n`?t3ne)AmE4S%^!LpdmFNmP=D+uj9Siwt<} zX735FXQ%@QBFn*@oDBvH3QLu;Kno~}1 zx5vuG`N8 z3`C%{NlCzH`uUgh^u+o5CIA0VPf2(n{OI3-0|!3zH8ws3r5t-Uwl?|GJ@wH^m(Kvj zfx2MY>grDZe(LXEAp7_8{6@zk9S7xgOY0igB-+vti7lz|)|WpQ@6`w2wEQVqu_b<| z5irFoY5r^URpx;h)uftg22^hd#F0R&?0I;2$`{^K;DE?7GrS6azvq$fUI!50)78&q Iol`;+0D8ZE4gdfE literal 0 HcmV?d00001 diff --git a/src/images/redo_1_24.png b/src/images/redo_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae0543af1fe406372432c824f7c7f5008c57084 GIT binary patch literal 870 zcmV-s1DX7ZP)F!HD8{BJC}$iLJZ35B4M?|G+CM1)?a5Cn6i0oA+v; zMfv0Hv7vmaEM?)HA4X#jb!{GKsB7FA`2GWm^AwBXaB2b91fVG5iL`B4zn7<+I6ETsdvE8wmB1L@te<<-`vj`w2K_3IQXP7R91sl{PXwG`(Hp@@jI#P3TyzTE1`i(wsh}{R@Kz1sDPvJ(hhK_7RQCF;y_(-PHJn`^xnHZsP>u{hf6Eo z*4O)1N4)bj&+|mpffh*6<)bimYRTI)IlDw?GZ@WaT!_^WOI~bXUNKpY1OU%`(72&B z-u_Mjy$Py17Q^c-5EJ+o+WMO z!Bdx-=WP0h4u=_?xpk9c>!hct%^N5_EG(?Ff8>z)ZbiGL%(dq8$#GI<4iPY+PF)(a zub&(;M@^RS_I7;XvnuNa42VE3qsiZn*=I)%n$cTx0)XkIpES1C!w(?L>dg4(X8Vty z*oksI4&eFV2SP5R$zPAz=T6*)mSBWgKLAioPPzSeLyK@er`Lb^+Vr0|V7@P#17Py} z?D?RGxj5>+yc-Je=agPKf7J9Jf44kZiXB72V{e{`+Be3c>4r|C{|5h;@BoJQneo&O z9gS2G+4Q2{xN5M?U?+dD36!w?5&wzRfJ@(sOT+F;{9&1H*y!zv_sXXeUpTWWFu;Yc w+`0O8nXJBtmltMqWNC&w|I{js$o~cY2E;Rc+~=-8tpET307*qoM6N<$f*XpqNB{r; literal 0 HcmV?d00001 diff --git a/src/images/rightLine.png b/src/images/rightLine.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d85d43d0a00d1437406d58402ccd52a5d1c658 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy2ckYxTe9Uw}f%o-U3d7N?UF7O-tFHNBghowci7 z#EhBwaJ>k#$Ck;GM;VL`*0TYDno%qRyAKaD%Zv+q3ntx*OIUV=TV_gCBj?;@f#GA12 y3b)e~wI$zQ#7%HGrJU)8u+S=v z1gwIX5Y*kkj5{H-&fJ~3_gLK7+09NN;wh&1xZiKS^G7ze*FRso*SY_2^%(%IMw`FY zr@=c0`x!f%dvXE5S-7+OnBKy5mV;GL5I_Y`t&Fib;aB#9kKcDI%>#0!%N08AGA2z? z0QG>1ArR;yT{3K;a{#N1vV=evE3=5s{=Cvh;{;c59$?3cNe!t>&l#lrqM#muF{Tbs z3z;ztvLlv)HAF#u_>!g|LOebJz!t7PgDB~9vDqUt$5RuOITR5ujf!DCfh&~V{kOCw zpee11uS_y6t2w#LSm@0S(ORW*DfI2m4z42jb{aqcxI*Szp!(g*CtKWJdr&)`F!@RU z^pLF&ul(Dx8j}`W?q_keeSuocY)jKzWhFG%jyqZVOXM_}c%%qm>u1A{-44yjlWM vmsIa29s$_cUjGK%=G`P)6#o6otP#GyC4l`j*|5fTW6zUBINvZ%AR2E(HI9rI1$q z52Fhk^e*0`P2myXkkk zNn_OYwYBhSf4{8jn!2t@DRFvw%5XU3`PSCt&EerhMAjsP_rt;9WdN|8+wNYvNZUoK zl#;BhtVpNRk#4suqtQr?kB=p*_S}8l-3wFQ14sbwjsR|knNbu4RaH@zB}GvXW5mn| zA>d{Z!aTxUV0KNFloG90ix?v*B{nuT*xlW|ePebPUS!_E)6Gq*s!EDh3wNh(w~-Ja z1RO9k5aA|guCA{U5hMirdU6sIfT?1tRGkhYf{Wb7GDAWj#)tr|s^U?*&3H0FRhJ{Y zJviXS&JJcq&KXr*!bSdhFyP(M(Sm>(Wl?Z>dCB?tIjXuOu*j>bBF@TO6i`)SjP(2c z2e;3-o5@lHRi$YfE-o$}bWoNhW`?`p@1WP~-Me{dmNULo;+?>BI{hd6e>ixux=IXz zrfC?D$A7gyiy$IA?sWJ*69^(weEUeh`9!V8G#k@7>K!^+jjV?LDhRh9kp#$(v$NM9 zPJZ^klvn9SJx$e9Hexmp?jRx-f@lnqV~{+W_VU@JH3q_Oi?gTNiOVCR00000NkvXX Hu0mjf&SeDA literal 0 HcmV?d00001 diff --git a/src/images/save_1_24.png b/src/images/save_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..621fe372a160f2733a787ad9e7aa5f725ca2e5bc GIT binary patch literal 833 zcmV-H1HSx;P){y0Ruxo-DMlWwX3WG z10#NeS-H`VkWb-iHVKG3G0+gmLPcgK29gl5U8G;ny?C$RJ zbTqorV1T=$8i222J1By?WA2CuxTC5RMM1CEV`*uL7$X3a$%L{j0WdS%y;Z=?-UX7OoM_IxFK^!D{jDtka?Y3;Ip1&dtKr)z$wl zMb7h##SF`NPUC-);zhtRTNT|-N0!f>YZo0I9i2Jy-<6%2vA({JnXxh$@N6fW53A-R*yvHBIjaNOZp^$y?v@;aiLp?=$C^}>a>B!um5 zzaN3z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;cS%G+RCwB)lf6#kN&tnwnT%t{R^mt?3JQ97gG>8AIF~CT)eQmN^ws+qoec9nIn#l zj(nD7JUl#5mL$5?C0vW&aCJ8o}p84iairMS4bAW0G?lgZzgmzUr9Bw3av)>^dI zXss!Vg4t}wY&PTk{G5}M6K-y9h@uFsHF=&h8jZefZ*Pa6jg)f^=NwvVthGEnJ@NSX z$n*0v0M0q$I3`IFj4=d3Kvh);ArxR+BV!CzRkcR*`J61v==b|1NkUN+gkgwM3S$gS z(;%f}JRTQ^hleeyvesgZp(qL#iv{!foWWqg`uaL~o@0!m)9FyxHP%|Z_Xr_c)T*i& zjYi*;F$O6maU4_EHPh*owY4?w@9*jN`|R)UPPKqni7WL z(nL`dwV!u99@FdfT2y7N#W_b=mT0Y)CTf}n=N#5r-rwKpcDpUA%JZBc2-=A(llPvF zCA_@6Af;?kRj=10O;eOobi3W9M%`|=O|`PJ!eB6HQ3dc!=YD7MH?F%KhiX1 zcXt=(+!rGu1XWcLMG;$DTf}k9!NCDpmZ7}&|9o8B+1W{6Utf_@vbnjr6xA5hj@mhg z`t=$9FRJ)FgZ~<9Q9qykNkRznJQsCczyCV`5tXXuO7Y8f00000NkvXXu0mjfw}V{u literal 0 HcmV?d00001 diff --git a/src/images/save_as_1_24.png b/src/images/save_as_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2e8fe87ab349accb23387e5d629ff197a1d06c GIT binary patch literal 1005 zcmVz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZaB zYwg{#xw+~1%WG$6N4|RJ1FWyFb8v7#yWM7bdYaYM)qKI#)fLrhmC4CTR##U!Jw2sf zud}eQK&4V~UxE7o&1RFAmlx{wx*HxI2B6hy3BcgsAV)_>uDiP%KpKsPeS3S;tE;PT zPon@~7-Fq;@9*z63`6_tBG2>a>+7?CbIwT=Mb;SeXW%4BNRmXtFw`&%_4)Z30Aq{; zI6OS0*=#BxaU2sxkw#JUEwG;fKR-WncXvm*Tqa2p3WWl`?+d`<;v(bY;{XIfKp2LE zVfbg@dcDr*=%_1|N;XYXE-o&#r>6&ip`js8PEI5U0?yCRsnu#yE|&^owYWj_+>>|Yq`0(Ax%>{ zQB^?FG{qRBSqwEZ&-Z;)l{k)xquMH&PF zs*1Jtr!kYk^E`|(WG3zH?P+gsuZ)b0xMH!W#bWV;aS#M}o`;Btsv;tIo|l(%UZ$$3 zD!%XMr`Xuou$iRy_xJYl^74c6%E}7WYL#lW`oCM|?Cfk7Lj^=c+`zzqUR+%K%XnvJ zM?|Cy1fM^wR4U2R(h~FY^RBC_%f@kxh-jvJ6h)LuB_19gETEp}p{jYZ{LZe;Um0y} zZ4pHg-QC>`4i0*q7`fk=>WPT+Jdb9xNvqZR(Dj^nIA(hjixW?7m&Pt!E-A>RVu z-rka?sibMDpZc!=nPILoiilX}oOa^+J#ZF1=`@K?y+c1&Xh$0TocV8olO$nxclWP; bwEqkME65BV9!?*600000NkvXXu0mjfwJ_5a literal 0 HcmV?d00001 diff --git a/src/images/sendToBack.png b/src/images/sendToBack.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6de9ee2e0cd3333ab0dc2772537aa547f1e64a GIT binary patch literal 431 zcmV;g0Z{&lP)x0X#`W zK~zY`y_7vp!$1&)-^`j#a6y!C2F^f9Ly?j$XQ6OqBvNn@-ylUUz)>i$MGF!`fxR1| z{h5svMq0~~*YnN1oqfQWg8<;UZAJUTW7ALxpqgIp*X!)&{ccy>fdecSS7(vP0WRlr z)epD!Ju2tx=QTwE%*G!K6XZLbXSrFufnb1f2^atmU0)|Vu-0n3zJS1hKoFR5P&g}* zoy|&Q<+1W9Ib{KLU26y11d`_gFWapS;AJ^p@rxFkl;vji0f0eZh)cqe#58n0C#NXV z9YH`x5IQK1QibLKUS|m=OG={wm`Ih`szZg5r(mx7Y{H6ifvUzeXIxe?OE8>nvla`~^#fYZz~JfX=d#Wzp$Py@ Cq*qb^ literal 0 HcmV?d00001 diff --git a/src/images/table1.png b/src/images/table1.png new file mode 100644 index 0000000000000000000000000000000000000000..09e13ad1455de026dec3976b9a87baafd446a120 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)2;Gvlz@I-pj=TMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`&|}pUS{TBoT9scLXst}5hc#~xw)x%B@E6*sfi`2 zDGKG8B^e6tp1uL$jeO!jMWvoDjv*GOlM@yQ7#JBC7^s{#`t9HMY-i?jiO2*Q&RV`5 zN4mT11Ag2%5*PF5-~kYDSt+hz*1&q#bH|SzMmdKI;Vst E04uLod;kCd literal 0 HcmV?d00001 diff --git a/src/images/text-align-botom.png b/src/images/text-align-botom.png new file mode 100644 index 0000000000000000000000000000000000000000..1f7f1bccb48aabc71ad9129a0fab59bb39336543 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)qpYZfe)N&Yvw%WLo-U3d7N_4{+Q`{pAmDH@ze^_O zQj})iqkqZ~9eIVFjU8cp3Q?W;P4P7qD;Onyt^267LQ9b)sb_^&9LsZ=>a{sbCj=il z zZ;XsjB9r!w%Q|cu8d(3RxGtT;qcG=)`9W)&3J-=UrHWf7s)S99Xgw)%?AVJCAq5IK5ii!=^XGZ@!X#eBHgN@wnvI{uU-)x!#w28sf)z4*}Q$iB}>svq$x~5ht+e4LmEc|jp45iVWxhgY5Q^FFtS~qH1O;-sjcr)>V zavj$X!wu&eb1h%&e)wdqbP0 Hl+XkK&+$lN literal 0 HcmV?d00001 diff --git a/src/images/text-align-top.png b/src/images/text-align-top.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6bbb5f524ec65c59d638ba6bb6b0e1acc8c5be GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)qpYa8(f+8(JwTx>PZ!4!i_>rWt@)Y_1Xz!Yee%kl z9w1mK{H~sbi)DL+w6}}rBj5xq^x zTV!EEm(K&y8k+1`r;ep zanMG0$qs?|&L2KC$Bulr72fqQ{9pGwhyBHOFVdQ&MBb@090*F6951J literal 0 HcmV?d00001 diff --git a/src/images/text-align-v-center.png b/src/images/text-align-v-center.png new file mode 100644 index 0000000000000000000000000000000000000000..b505637aaad8a339ca3fe89695a82b59331810ad GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)qpYZfaLMZVvOu9kPZ!4!i_>o}Y~*Y(5OBCSU&M09 zlC42^j{J4sAaM7Q5OY@;pTaGUeVlgkazzZa*LNv2trALBS=zEn$mPSm&H2*VYp2XH zG~Oh+RAgDD<&S-@9fe(v&E{{*j61gfL2J`}ZofHM(X3NHUzZ13#^CAd=d#Wzp$P!y C0Y_5+ literal 0 HcmV?d00001 diff --git a/src/images/text-align-v-center1.png b/src/images/text-align-v-center1.png new file mode 100644 index 0000000000000000000000000000000000000000..7b56ffbd378bff89ff0b9d8442798f1894f4e9c9 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vn+$4d}LXj8c-C#5QQ<|d}62BjvZR2H60wE-%s@pN$v(Kw&{=X`^_fnmU^23D6T z|NkHVz|K?O{7~QE-_Z@zCpI>Iv^P{UFnE&ke;(6i-d4-w%bHR;j1|AyZ#v6S(amDc zlKy{I(;D%Nuye{ncOLwezxwWez>k>{<_3S*oiFG7{Xgq}=)co{r~lFaH2=T-_xf)+ f9X!fMH*zv8ak(u6{1-oD!MUXUS zAr(%pgTf0cTJ|=$KXiO&%RH$;;ozflF$NqWjE%|~FZ^!rZ=MmmBjNeBWph2#etn-^ zKWmP0RucErz}ka3I_Kp0j5jy(>|i_O6{fg?(Yxh)ef9R|{=5t(TY1u6cVFK9cbe4P z>;pj!UMmFD7+-e_iJp6}KVSUu%(I#q>%VXEni<>L+~n}9s6vbDSdNp<`g>{#1$%Df z+Pa#TZQRC#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{=X`^_fnmU^23D6T z|NkHVz|K?O{7~QE-_Z@zCpI>Iv^P`}`P2Tg^~Il~8@dITHCPA-{a3!-)3Cjx%=yXx z_>8LclV7mqn+PY^{qor&o%8>H%d3``{~Y#6bGV5yoI2touNPXs5@;QRr>mdKI;Vst E04%Lf&j0`b literal 0 HcmV?d00001 diff --git a/src/images/text_align_left1.png b/src/images/text_align_left1.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ac107763bfd781db7f7dc4be1a2cb5ffabf602 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vn+#v<)nmDvw%YPJY5_^EKYBoyw=afk*D>%stpfc z^C1OJ{)Xeqf-18oJg8)o;S_3eYfQA&IKrmm=#+kIo|s|z&q(X(v*v|tS$@By?Tm~6 znuW%@q}S*leUoQClg;RX6i0Ss>jJhlLUDCj=F9z=8F=>c?30zb`))~g!>wfzyaAk| zhg1?;ci2_Rgh~56fAAs8I`q~%Eg4ysSM7(hi#ME6JM!mKX%ZXz^XN>~e?A-IqgpF= zRQz;j`<*`f=Dj%=&KEuxeXHugzk)^V^Y>24H?sLlxE@Xo$TUw#-P0~rz-@DXzwh}4 czm01d&Dw7W>Rn8J1oSC`r>mdKI;Vst0I@oK#{d8T literal 0 HcmV?d00001 diff --git a/src/images/text_align_right.png b/src/images/text_align_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a1502571c99fb92b1579c3658bcc50c5976b8e7d GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$h_H=O!(Kw&{=X`^_fnmU^23D6T z|NkHVz|K?O{7~QE-_Z@zCpI>Iv^P|9aJcmUe!yIVina{lp#RFZdm6TTlr;aYZ;9)u zJl|<{@VEV{yZaY@Fz(E|@awk^Un7@*KSPZ!4!i_=>tulI8f-~FrBl_-7j|Wt^mioJ6FH-TRgwM zK37~YVyIUufO+&|R}7 z`qE66Yy7t-a-Lh)ubl38;`+Mh_8Y(Q&2sK~T>5pNJMXgR?T(6DzRz(ho$>G9g|oks eWtyHP|6(&qzae-b!MY3RQwC30KbLh*2~7ZbK#3&) literal 0 HcmV?d00001 diff --git a/src/images/text_bold.png b/src/images/text_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..889ae80e37b6167cc15f2a89e05a183815ec18b2 GIT binary patch literal 304 zcmV-00nh%4P)b^}|6b=Y6y(;Y{!a!g z@UQp#@Aw}>L3(}s|7f5BUjeuKZvQRjV<2U7yvu*H{aAbvQ6K!@3oKzW z-{Qa8d3gae1^)HE{~f^!v<1}u>;4xnKvUpW540I-w9J3a{{r=B3T*2g{_BH1CtaZO zpZ`6V0*V5g1e5i;`_=Z#_e=H*@8|93RG@lX;D!K7TKswwko8{x0000%Ra10bfZ( zK~y-))srnqLs1mR|N8(11y=>ZMUy-&Cc!!p{3wd)8BIEiK|~BzonV#;7TcOdP?$E+ z1(RiqhM|+)_wGISo^zjVuDFFI|Lq(OKYpCUNhL{wL6XLR85of5E)J@N5Wo(53PgO% z87YbNfz`6$v{W2P@p}8E^{2tf{B4;%Rdn0I#!@?9tR7#iJgwT8D{Os8O743a0Dv_N z&mLZWmur+X;1d|-g1!K!1r$pMuyGdTtdF{i)DuS$0}-6bYP>n$-d!A5hFS&;Gpe{MGmq@IRmF2fAb8f$1m!TmS$707*qo IM6N<$f>zMOCIA2c literal 0 HcmV?d00001 diff --git a/src/images/text_italic.png b/src/images/text_italic.png new file mode 100644 index 0000000000000000000000000000000000000000..8482ac8cb1eb8bc8edbf64085108f0fbd204fadb GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$B^mK6y(Kw&{<9vg>Q9!g~ne(gm zmj4swoA@7?D86%i^8WzK9JM17E&sp&Z#dpHfz$E-U9ks&4?Z9Gyg!%0k2Q{M-Tz#> z2OnD>vrPZ*#{EHKLq)>Jcx{H|Ovdb&|4aQZWSipI{El%e^Cxx{^9vSw28s;a3IDB= TS1%U=TF&6<>gTe~DWM4fm>N^1 literal 0 HcmV?d00001 diff --git a/src/images/text_italic1.png b/src/images/text_italic1.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ec97c73c6d782f385940f2f76e7490a2d925c0 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vn+$4arQc)qd=i&o-U3d7N@UHHuPt56li_kWBZ3$ zJ7?iyqn$4G2TZ>SWO(#^5YFhWKh)B_aLc4i*G?^7u%M-@ui|0f-MM?WJA3o2v0VRY zYyKzSd$WBMltNs^LjtEVPPZ%mQD@AyTTuJT8mBDYXCEJE+sxyvd%Zw@dw4>5>NnT# zUll8VzN}{4>$#iNZISVk%ZWkyvW=e?JytkU`SIIwzKZ@6jvnvNF`skWQJ=SMja$+t zrMb4cua}-*VSHOq@qJl7%VuX6mLyjF2PrMPFP3Wf*?rQzoW6(8i!o1LI(fCgESVJ3 m4$*z$n|(ue9r^#+hy9d(dv;jtL@l6?89ZJ6T-G@yGywoEM~K}3 literal 0 HcmV?d00001 diff --git a/src/images/text_underline.png b/src/images/text_underline.png new file mode 100644 index 0000000000000000000000000000000000000000..90d0df2868871c6cf1bab25affe0d9f8b3f98eac GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x?CIhdqH#X?$N2_%BY~9*Y!?2h z{rUe=9fy8l?U(-(m`sFEeV_iPeWNmK)A{6xz&-Zw?GGia|0}^&^gUfcv*1X`gnjmc zo{g-_np*x&^x*npDC+Wt-z8{4+sXs`@BiMP%+Rv-k;3)Ae_+S0!x%EHv-|4^N|MkDje{TP~{@MQ}vm3aX7|tvG V&AV6mZa&bt44$rjF6*2UngI1lb~69~ literal 0 HcmV?d00001 diff --git a/src/images/text_underline1.png b/src/images/text_underline1.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd9e37f8ce5de0e716dbc90a80ba454d6e588fd GIT binary patch literal 417 zcmV;S0bc%zP)b23fMiI9zo6nu$kaOO2ZyqdoMzOCW@mO1s;=siA z;_db$moWS-ih~mj2bj)W7iybc)EE`AG}q00000 LNkvXXu0mjf!ELYg literal 0 HcmV?d00001 diff --git a/src/images/toBack.png b/src/images/toBack.png new file mode 100644 index 0000000000000000000000000000000000000000..87300a3ba1a1952d0f17c3d0e8dad95dd04fe6f7 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy8Z+<<}STI~W)k1wCCHLo7}wCoB*!FfuSO_z{}* z|G3)Dm4CIA6`3OvdU|ui162O3F6k&@ywl*nKhD^|z{qJ1i|S*wSxKcg7yY^1Bf+-k zN8R+siH)4D3)iqdS1dW(?_ab1@T;cj@$VCNJh;BSo`;9$zoY~Z{sZbZF#31=ZR)mEFe_&VQ`Sa%!|H6m% zN3Q)Z=>MDUV9tBEA^!e9LxVraQARn*rh-q)I dl|%*;L+t&8%auMyt^mV}!PC{xWt~$(695dVpV9yT literal 0 HcmV?d00001 diff --git a/src/images/toBottom.png b/src/images/toBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e8bd35302dac72ec87746df080573b7b664177 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy8Z@k! z=Stnwi4z!gPRv==B*wOj#Ro}LJw2kGL;4l{aAGpyjAa7c{r$BiQ!qCyAtAA$%CW&$BTJY5_^EKcv8q{w&3LBRF?1yNni zy^MVAM~j(x*iJKAFtG5>D&X=kkYQ?dT~N4It51pTB3qQk7Ea&#O-YmH-mU#CR=33d zod#>>hjf)#o@I9rNq;{byzKa%{D|{rEff7Ee#Ye6C5jyRYWrY=?Q~}W5k`~R=~*`= zGcKKbE%3ANOQS(#&kCKdSvrdi{8Q7|_9jZ-E-LJ4PmZz(+mrM7l8M~5r<)?qb_=k~ zlM|WxWM)v%VvZA&eFRMYNzPht++1)cc7@5-j2ed7Kg`8tIUj=phQZU-&t;ucLK6T8 Cvv7a_ literal 0 HcmV?d00001 diff --git a/src/images/toFront.png b/src/images/toFront.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4f770fbe845f6fa0909de6bb48202a1b1c4caf GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy8Z^d6~`k-3$zj0-i38Ar_~nPB!#AVj$ppKV`0P zLC>4WLz+7now!W7Sf>>5vdm%O)DXX@a8OA@;N+&xM+*y54joH8tDk$e{=Tu?$!;Ic z7r%bQbxdH~q4mB__MP0h&Z&$)GU6Or+C}~;Gk@3*paO+x%mbc zn-|{N_1Q<<;oqCrCldZ<)^lA6yn5b!yR^yHrSAC?RP`K#OCPRTwUW(E#^i#ce~f&H zZrU^>@0RYx(*Kj)*PZ!4!i_=#pY4aTl5O6(zK|LyH z7qbjscRITS&otHz3>>>M4rwVI+`u6s)_82|DvK@&m)VytOt5n(og}FItoXeoL)+zf zpOUxyF!tFgarXDt=`vyIKP?y%Hs6@EM9@>JaJRck=A5hjGakQ7Qg;ksx$sFZG@9Qe z|GBA)jxEEC*2(YZ=7=3DpCii8_E>M-vI1%{^+P0Q3rjr>mdKI;Vst0Kc$pWB>pF literal 0 HcmV?d00001 diff --git a/src/images/toRight.png b/src/images/toRight.png new file mode 100644 index 0000000000000000000000000000000000000000..60d1f0f4ca8064b654dba7132c8faaff83fd691e GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy8YYU-IwVM?j$yo-U3d7N_@4vgJDDAmDbtcaBAZYylXLp$Hkqne^ZmPZ_T0Q2|CwV~juSVB z!VKxv-yBY*F!VMo>?myce2~4SZq@tboTl|+kE?d7dMdxuQV0|*luC1NJ)))HsjPQA znwRzD-)WbApQ+7k2<#G_FlTpwixO|x&D;4uX76kJ$XNH@PFM7D*jb>T7(8A5T-G@y GGywpm8hI=L literal 0 HcmV?d00001 diff --git a/src/images/toSameHeight.png b/src/images/toSameHeight.png new file mode 100644 index 0000000000000000000000000000000000000000..823f08c85eb85b7ef109cde07d399869217afe22 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)vy8ZvWcr3LuYf{lJY5_^EKVnH@elcV-e5w5;IR*@ zuN*5lx$N8Oo|Y#O6Ig$1i#hiEIe#GFhG6?5M{@^>bNlu@)Sc6tbm01Z`2~4NM+&se zwe1i8|IfqI)58Ma|WwIpR=*_(T4nbJA*&R1=a7YX$rVje}}E+@85|J z?GM-M$Td_jN;?=nI6eQn#ohyll{&5#@Q5cAs}(62JurV@d#xcUAtB*GlAywy*8F;V z1y|8o+z~7r+zk2j6S!R%E0hjrG8Az+v%k=sTs5=v(is;H;o{#Ag znLU4F<*BdFYW!Aj6V#d!B6}#yeaDg*jP(!KxBWk1*WB#CKh7}0Sn4qAjkoCuKYqLxJ@Vpz10hu^63AmVePH3X*_Z85c9M literal 0 HcmV?d00001 diff --git a/src/images/toVCernter.png b/src/images/toVCernter.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe51102d57a2b5eb931382f043a345beafedc70 GIT binary patch literal 315 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 literal 0 HcmV?d00001 diff --git a/src/images/to_center_2.png b/src/images/to_center_2.png new file mode 100644 index 0000000000000000000000000000000000000000..78b49351a6ba6a26039cd948128373b8b3d9b934 GIT binary patch literal 3097 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 literal 0 HcmV?d00001 diff --git a/src/images/to_h_center.png b/src/images/to_h_center.png new file mode 100644 index 0000000000000000000000000000000000000000..0e5b0f6915d2987bbc620e99f1dfce153fe0adbe GIT binary patch literal 429 zcmV;e0aE^nP)) z<^#Pqvocg)0wpPdq~%=n&TIg?MPS+ee7)V(5esl>+5BzRH{0k1kT`8(NRz-Ur6$Yk zwRw}1rG|};;`H72;L6nweKj~L^Op_{rp9?tkq>*tg$V+ppn(L_s)FumjVxsGAGD|( zq;`D8S!DKr2DE9^uWs$DA#YLsl8t-FK^RxazE6eqYIc*12B$3eKiIafSzO)!-ht~M X@j+K1$Q&a400000NkvXXu0mjfaXhqD literal 0 HcmV?d00001 diff --git a/src/images/to_h_center_2.png b/src/images/to_h_center_2.png new file mode 100644 index 0000000000000000000000000000000000000000..30679ffe5aa5ba8d5f40587f01df1781baa8444b GIT binary patch literal 3114 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 Ef(`w}m;e9( literal 0 HcmV?d00001 diff --git a/src/images/to_left.png b/src/images/to_left.png new file mode 100644 index 0000000000000000000000000000000000000000..1427073f0116ce653eb5dee0ce3322d722e87f2e GIT binary patch literal 375 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 Qi2wiq07*qoM6N<$g1isQTL1t6 literal 0 HcmV?d00001 diff --git a/src/images/to_right.png b/src/images/to_right.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9e5e92489649d7d74feda45e7097cd87338af2 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYs>cdx@v7EBhTzHeO{36+d%Z1_nk>PZ!4!kK=DAI|dzc5OIlD7h4mt zLVJ7Mp~V%-=JQ$>S8z?wQ{kARz?LKKdCV|HCFm$u-PQG{LYCEi|MRY`xODpL{x>%~ z+}U?{{M{k#Q*+|L^7GkWnHYBL*?&vP%ZIauK|6s{r@=CbP2>Q}XDeCp{{Qh41$mdx zn4P6L``SV&jZZD*3LgFM{xew}dv&}+_r^XYW}oA(d`}JtNX$*UaHy+oyFTBJtj``C z_Y3p?)=WOp*qjhQLw5t?sa@9<*^@Z;T(>>0(_nst=ktWJiBZ#hW?mGWsihoNd@K8M zpZ2GGgQM!93Sn0Kky*!s4)Dxj6^#`v{&p_={{;t!zLUJoVO^^q+HI9dnUn2b%ghlG Wb@SVgqYc1tV(@hJb6Mw<&;$UC6O#V` literal 0 HcmV?d00001 diff --git a/src/images/to_right_2.png b/src/images/to_right_2.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec05c65303c1f522dcf59e3d2ee66b60d565367 GIT binary patch literal 3132 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 N002ovPDHLkV1gFGmK6X1 literal 0 HcmV?d00001 diff --git a/src/images/to_same_width.png b/src/images/to_same_width.png new file mode 100644 index 0000000000000000000000000000000000000000..b339939c88251c7c4231d62683aef40795245be3 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYs>cdx@v7EBhTzHeLg%)$7HZ85kHgaXYL85j4^sH4o z0%JTEHeKiy|DYCkP`QHp{Zj4x2VSwES>DOnQT5`UZ8Nv5Qd1@Iszj zxr(27EKa!U1^+(k$enX*Z-wmIQ~Od!Fg>D={vs z>@`$7z){#O7{1#>H9KtPB^#s2Fdx(Ni!$zdq$tk#W1gxYcW6-@AIl`=Hx}GRyNc=s zv=;cb&)umj+tcS5<5hg^P8Qqe|A&4`zm{I4pX{f!hV3*k3>iFK{an^LB{Ts5Q=gwW literal 0 HcmV?d00001 diff --git a/src/images/to_same_width_2.png b/src/images/to_same_width_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4f1b9766d002ed67aad6b3b9bc8a13fa8ddf3484 GIT binary patch literal 3005 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 literal 0 HcmV?d00001 diff --git a/src/images/to_top.png b/src/images/to_top.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9415fb0c87ef4d95ac0b69256f1b97755e80d2 GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYs>cdx@v7EBhTzE>TOKYf&Mu85kJlJY5_^JdR(TY8Z4lfX8Kihp&f` zr^3R8Pef!|CtoOFkkVsve<+l>(jzNl+M)aPGJn>}&pyzgRc&(XtCzOqzv_s`k@g*b zt+|r!%-N@Ubx+M2-h`UJt3*!yezvMLyu>j6&boKAzU*H9_ObYd>J|p>v$Y-%Mf$d# zwwOA_Z=;FBOh0kIJlTh?yHy{>gdVeLu3%Yx=F2k z)fnU3vnT!%K4X10rZRon!E-`B&RbOlk4$->blz9)ph~fg+EydOHLmG_`%9lp-Jg7K z(bR)&u}_nEd=@yeEIM=NMiKwc_dI3iZ%?dNdd<&p#-TPXAl{eH#@IQx>$07Jn_%Q| twG|Hjo1)ETEQmYstf2qz;lIWoIZLnjE<5Qi#RCjH22WQ%mvv4FO#npzqfY<; literal 0 HcmV?d00001 diff --git a/src/images/to_top_2.png b/src/images/to_top_2.png new file mode 100644 index 0000000000000000000000000000000000000000..85bed4968296eca3012d9900fab6476f25c48953 GIT binary patch literal 3154 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 literal 0 HcmV?d00001 diff --git a/src/images/topLine.png b/src/images/topLine.png new file mode 100644 index 0000000000000000000000000000000000000000..132b2498af94e3ccbed8c0fd3bf62326e258f5b6 GIT binary patch literal 214 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 SE_itqWTvO9pUXO@geCxm$ZQ<| literal 0 HcmV?d00001 diff --git a/src/images/undo_1_24.png b/src/images/undo_1_24.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ce600bb35b7a43b5b0065afa5b31816794a864 GIT binary patch literal 785 zcmV+s1Md8ZP))~>z&|No4KZMEC3b?rBq%;a}` zX682s{6_aSh`is$q*7Kor^hwkSv-DDbw!2Eo>i+^thq=Xq=6p!8Zo1RdXx#u z0Ga5e5%cTO(8IPy--Ww%ZErR{{{`6XDsvW%nO&nrGQ=CO(=e9#T6BD2WuoK+Vht!FF4>WwNf46Adk=FX3HIDWkxGCGx zKNn0uwb!+?S4yGGI5OIbiUm;dAQ%yp83(DOlz~ucm^~+4UA>CwD=!o21>kM)+@4xu zotSSg7%q?kWunX|X26Ty{2IOSDf;JUn5}MP@FOzZgp9VKV&71D2&IR?h|nv`D9F)h zKKYm@KWn_O1l#e=<(C|T^UIAd&oI9>B(~i3ctwg~H-GRuFNahzIq6o+cVIiZl#7l5 zEbg#k5wR#1GzNU=kQ$))1^GmUGczXR#27wh%8$ z4pG)U4iM{0acrH(;o*Z=iAbznN@VpTM)i1k4?Ymuag8;;7H%L=J!bBdI`YDq%|XbcfQeV>YOj20olFfnd5;7^;hU?{dLtJ#wt zosfGM*MgNO-(KDVSv~%WuB!79tn+c;Prw3NL>2@h+yZ3U|M+jDWmBk|#O}Z4Os1He zT0}qpKAInINxqiIP)JD7G;sl$P3= zmW2>E#<;*%7cM0x=t5#KaRJd7jUACTB5~4Cp((^_W2~M2nHk#Y%$xV#=b}Qa63^=9 z=H{H6bMA$Iq3h^t0PH%k**ti9TW9Mh%{{wLY_;hF3m&EPedK z3;Ni1&+7Is9>4nBTMs<|(9yni;H8a8gpiyWdx!aKc4T&9Vedd^di-c-7XqN|)8>6T;7rw;FcoGs08MLm&{+2b z*XDlUzGx$LPMlL$j`PRjFBEbv<)VM^!~Me_8vsFBABwKCDVKbWiFmc~Z6@<$oE?9U zg>s&enF|!XMKZZ5B9Vv=RRkgu4IcoO2>@^Mr+GF$8W*OrIQ{dRlmnNdUqB+r6*G8l z!1~%vWJ?*5nVM&HtkMH80DMmaFq)cRRor3AgIg(hd8Ck(eU}=$p1PVCBfkw($d*xt zAkaPl5O+YKQ=n1a#N z1hGeQC_`{_x`bt`JKoMM5B$K_09u(+EEoE3Vu}2Rs`j-OQivc3#BG9d$$wpIwn`=9 zfL4|eAg~;TVXjctfN&SRKMPs+4FLIaYa0Wd>1+9^;=NLd&n-vkaHWYIwX_|I;22ee zZ42885wZ<@H~4by*Fx-rJwxe4vX>Q(Jh^=bwYz7ZwyUjkk=2%2UvsyXLK5gelSC-iYX?tpLQftdc#cXAUO^cXmB>Y?A?yNcR3`{x51-E!i?p67K*2 N002ovPDHLkV1hDvjmiK3 literal 0 HcmV?d00001 diff --git a/src/images/var1.png b/src/images/var1.png new file mode 100644 index 0000000000000000000000000000000000000000..c3db99fab500fda35f8a7765d5b17beace23cd05 GIT binary patch literal 507 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Co3L_t(I%k7fQE5iXC#y@-U z)(Banwm68417Tz9p{Ezoj92s9I>4wEQhU3t)?6%6H1$sABWAnv-vv6 z%iV#4&mZvgd7d8lZB%x*Relnn{;|TvbyQO6l+5@>a0Q%L%DO%U93C61;W;|12GFRq?*{P)1?476DCPxV&@zrb*GRd(j^0{3 xdYuuCN(;bv_X<-R{nV7S;OtoZ13ysn&l^w^l2tzvPD=m)002ovPDHLkV1npm(9i$? literal 0 HcmV?d00001 diff --git a/src/images/variable.png b/src/images/variable.png new file mode 100644 index 0000000000000000000000000000000000000000..054cb8d0600549b6be437b4d119b49afd84dfb51 GIT binary patch literal 482 zcmV<80UiE{P);0?D&)8I5$&Zu5)78{!t~VVia@0Zq7oPoI9LgL6s5+WdN55%7 zpbQ`{$Y_3{Q`Me&{6K<%-RkgJ6u@5ftN`exmrI%;j!1+Qg0V9< zu$FyTuAO3%0Zjn7oBqaa>aV~%L|S_$YD2p4GII#_QB32p(xzwrjeP+Sq{_@j1fKMz zBQ<|Jn@SXzG@su2;jE_seokf(+C=Qd+rjmXzUk%$gkq3JjPL4_xEsy44`#M3N*ure z*!q01SKm?5W!O^r^U!udAehGF_1wVPr}~a?iz-no!$IV!VMo_uV=gk@&>p_H|KWe| Y2N$M$EiUk=7ytkO07*qoM6N<$f^Hhu2mk;8 literal 0 HcmV?d00001 diff --git a/src/images/variable1.png b/src/images/variable1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1d537b928e77360d2f534aebdc8227134b7aea GIT binary patch literal 436 zcmV;l0ZaagP)RBn}CQoReS>{!L5(rDzt85 zO*@(gD5RYP(S4)Gnj_-$u6aQHaz#Q!I^+(^DAbH)DU#cgk?QCf}5 z6Q8o~;B+x9Rg#5?!?;`+X5GR0a+*}*a`9lgTxd+s7m}=d`x77nJvc{m9K4A&0LUq< z8zwQ^0FnF(c#Am{>@79p`eP@wus>F-`WqqwquvJ6mduA>iU7Y)dgq8Q eCfa}c;Fy1~uzt7*wjpf*0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B!$L_t(Y$JLb0PQx$|glFuE zUcH+KfS$^ac>ni6{D^Ym2{`vO9PGqN)3n0S1C|mcPP99_`;CDMFCN>p>vy#T`}*9@ z;;oi`zTIBI(+X|@okf^MxJ7gp;VHsB!Y#lp!cv6a?2g6>i*iH|0!gTpN&o^N3V`zS znOc_yT9&qLIre4W;pP{8JT-UkLW9Rp;?5OtWHvLxVLrE7Z@X)o9PJ|J`Vh_v?Jl zdp282u^6u!&Mm-FHe9#)XsCb_Xe%)~f^@UdG$)s=erTRSMRI!a;21wg(&7xBUiSDG Z>l>)$OjZ8pZ%hCH002ovPDHLkV1f*v%QgT2 literal 0 HcmV?d00001 diff --git a/src/images/zoom-in_1_16.png b/src/images/zoom-in_1_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec3c2861d51b0c01cf84c5c00bd8a6ec7cd3065 GIT binary patch literal 692 zcmV;l0!#ggP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU0uBHe8HI}TjQ{`wMoC0LR5;6( z(obm9a1_At_e*UTnkKa=tUdHkLYd2i_RxWs!V02vFl1~xLBwOPJ9z1BY=^NqJ?(G zm!+j81O5^EF=R5CFvfTTA><-S(lQ(lZGs@AX`0>$g+jU+a18(;o6Uwhoz7My64?uf z!=$e3ge=R$TrL-jMx!qQAZZ2=000C*yl}hSZ#a%S-QM2rEKE+`bUK|!u~;l$uh(y! zoSei=fmW-mWCl*{Gv z^JH?`q3e$8mzR#M#l<@W%N{;jUM|V9JZ8GV#l^*$*Xw1A#Uim=sjS>vS$TySMt$Gy zKHJ>ed*|_ZB9bJPOo7qSQN7pey-g$%Pef5X7g6HT7Am%yeAL{+}1R$B8pJ~ilV3_NzSjWtz}JtKQ%r+KEp7~j^FRM@jU;{YPHU-udio+ zIpJ^hdc7(|QJ*wTo7Z)Hgr?~S@p$|opU)p(2><}-_xne7yS?-?GBq`IP$(3RuLJ-9 zIGxT4#<+|zo-+(%grcbX9LK%BG9b$`7>03(5c-TUo*fJZTDRNXg#Qg81c5+cjOTeC a0Eq85p8A0Q6^APx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXA| z000i8B{OaS00WsxL_t(I%eB>ANLyzZ2k_^7B{?o?)8yoslZcXbB?V<-Pdv@VvbL2jG7y?8S?Pg@xB$F4t8>QO;r*W^Qh7jx{ti+{@*1 z_a`PM>aPsX&(C8%pYQWhsWe+Em44$mE<=)}Nf3lnIF5Jq_xJM-hhxfax9{qK$>YPo zz`z&DWOBNvr)Sac_nQfVP*qh$wOXyr^L%1uWu+|;2&^K6MvO*d{-0nR0AOux&5ID4 zWm)!aZ*Q-J<9PhDn>THjMn}&If{?UYt$Tq$;BhDv%J4k@rJjy)0055TK8VNTk9R1qj?_^p2WO8!y>iYWnU4~)m?_R(DJJ0jc_V#w7 zTrR)1zrW7`z=!E{`q9C`fdK%je+Lr)082|tYG-HXF9bo{@_N19@pwGd*VmUD8ym}G z7-rbq+#Ho8=~I)*)Y#qK?U5wuO{>+q5{X0(b$#i%xjC!NX8XFewRMW7=_-a{)nc(| z$!4?Ry}i9ZMn*~_1>($ex|XJ_YpFc{3}f?rl09UZL{MLl2`rjub9U>N45IPofQ zE|)7bH8tHs2weaG8vtOMrm-Byjl13M?>9C!$|r&W07OxI5eH4vSf|rD?smI>IL3*S zg!mDDA0hP4bGZF^oIL4<&@^oaAvB)NW*-26=jgq9Efz}<04|&uj>Tf&bUG87rXAyF z002xTlLr7W;@|AGVzCI4BuQqo`6qTm00000NkvXXu0mjf7hCSv literal 0 HcmV?d00001 diff --git a/src/images/zoom-in_2_16.png b/src/images/zoom-in_2_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e41e780b49342872f8f30710898b5855fb04f733 GIT binary patch literal 802 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 V8%6wEKJ5Si002ovPDHLkV1oFCFaZDn literal 0 HcmV?d00001 diff --git a/src/images/zoom_out.png b/src/images/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd9e3d5d0db297fecc6cdc5f41828c370af716a GIT binary patch literal 666 zcmV;L0%iS)P)9r0w+mC zK~y-)m6JVa6hRn-y}c zr|S8;hetuB+Chw>m7fI8>YA}|b9{PcFnc6r8XZ9x1rbVxeLd;0uRFc=Vf9rS$cz-S z-t2?gvlc)HE&^OWb>l@>$Bx}Xx_HvT77fjl4xY5xwY|?dm>GE;d#)rq(1DDu8TH|P z$1<+8*)%!0epBqU*_&Q1G)P=;=P z4Wr;UK;#8(wNMXT7;>Mo}1i_Z!$=9U&c}DC~@%cFPD$N=4gd-aqPU zweLw683-k$gOD~NaQNJ)35Dv7bFl?*8{q!SI|E+U7vljN0*mLUqs1e&za2WqS=4H{R+W*A@HMb19ZkUiIcPGTi<2%64#cEM z7YB87a8n#KAtp`KFi;uPs7WbNLt zXWP%;JWN3lZ3hWua_M>Coa=;EZ_hp{4JRgsBVKer&>M2SJ^eig;|Jo&wbk;=IFOh) zlN7HXm6nUE~HReP0{QK4&|u_|hO-Phl9D480XTx)nPx4ysy5+OHS zIh+_jri_RwBVBDI($rB_ptW?YZ@P~RjP(K%NVEbx!0igh9A#xpTj|c-oBpkPGn3bx z0Aihy?s{ESI(`NCRkhP0Rn01+xPJCNLRZn(p; z655JDS%I<=YYo~8w2^2lf^XF?JK9&VMlN;%?f^V^am(4ReXVFCePskV0n$jckwLY- zT`9bK95g)1OfH>mn}ZIoYxC6DY_Kmr*sZJx)n&z$Hs4kY?-xVb%3h$@61EHZY$4a0 z#3C^AgX)-YsKeL3A_)9QGl>JKXc;K2FN>MR-W9hA$Y%?qz&ub22wY`FBnW&DC^e2W zZ%z)RqE8#^n-2e=OfJ0$OaU~_>&s$l*Jt`4NQ-`!@HgeNg_FSDRx_~j9qt+rw^9Pz QdjJ3c07*qoM6N<$f{||. * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include + +#include "apagedesignintf.h" +#include "abordertextitem.h" +#include "adesignelementsfactory.h" +#include "aglobal.h" +#include "adatasourcemanager.h" +#include "asimpletagparser.h" + +namespace{ + +const QString xmlTag = "TextItem"; + +ArReport::BaseDesignIntf * createTextItem(QObject* owner, ArReport::BaseDesignIntf* parent){ + return new ArReport::TextItem(owner,parent); +} +bool registred = ArReport::DesignElementsFactory::instance().registerCreator(xmlTag, ArReport::ItemAttribs(QObject::tr("Text Item"),"TextItem"), createTextItem); + +} + +namespace ArReport{ + +TextItem::TextItem(QObject *owner, QGraphicsItem *parent) + : ItemDesignIntf(xmlTag,owner,parent),m_spaceBorder(4){ + m_text = new QTextDocument(); + Init(); +} + +TextItem::TextItem(const QString& text, QObject* owner /*= 0*/, QGraphicsItem* parent /*= 0*/) + :ItemDesignIntf(xmlTag, owner,parent),m_spaceBorder(4){ + m_strText = text; + m_text = new QTextDocument(text); + m_text->setHtml(m_strText); + initText(); + Init(); +} + +TextItem::~TextItem() +{ + delete m_text; +} + +void TextItem::paint(QPainter* ppainter, const QStyleOptionGraphicsItem* style, QWidget* widget) { + Q_UNUSED(widget); + Q_UNUSED(style); + + ppainter->save(); + + setupPainter(ppainter); + + if (isSelected()) { + ppainter->setOpacity(0); + ppainter->fillRect(rect(),QBrush(QColor(Qt::white))); + ppainter->setOpacity(1); + } + else ppainter->fillRect(rect(),QBrush(Qt::white)); + + //initText(); + + QSizeF tmpSize = rect().size()-m_textSize;//m_text->size(); + + if ((tmpSize.height()>0) && (m_alignment & Qt::AlignVCenter)) + ppainter->translate(0,tmpSize.height()/2); + + QRegion clipReg=ppainter->clipRegion().xored(ppainter->clipRegion().subtracted(rect().toRect())); + ppainter->setClipRegion(clipReg); + qreal pos=0; + for(QTextBlock it=m_text->begin();it!=m_text->end();it=it.next()){ + for (int i=0;ilineCount();i++){ + pos+=it.layout()->lineAt(i).height(); + it.layout()->lineAt(i).draw(ppainter,QPointF(spaceBorderSize(),0)); + } + } + + ppainter->restore(); + BaseDesignIntf::paint(ppainter, style, widget); +} + +QString TextItem::text() const{ + return m_strText; +} + +void TextItem::Init() +{ + //setFlag(QGraphicsItem::ItemIsMovable); + //setFlag(QGraphicsItem::ItemIsSelectable); + m_autoWidth=NoneAutoWidth; + m_alignment= Qt::AlignLeft|Qt::AlignTop; + m_autoHeight=false; + m_text->setDefaultFont(sceneFont()); + m_textSize=QSizeF(); +} + +void TextItem::setText(QString value) +{ + if (m_strText.compare(value)!=0){ + m_strText=value; + m_text->setHtml(value); + m_text->setTextWidth(width()); + m_textSize=m_text->size(); + if (!isLoading()){ + update(rect()); + } + } +} + +void TextItem::updateItemSize(RenderPass pass, int /*maxHeight*/) +{ + if (isNeedExpandContent()) + expandContent(pass); + initText(); + + if (m_textSize.width()>width() && (m_autoWidth==MaxWordLength)){ + setWidth(m_textSize.width()); + } + if ((m_textSize.height()>height()) && (m_autoHeight) ){ + setHeight(m_textSize.height()+5); + } +} + +void TextItem::updateLayout() +{ + m_layout.setText(text()); + qreal linePos = 0; + m_layout.beginLayout(); + while(true){ + QTextLine line = m_layout.createLine(); + if (!line.isValid()) break; + line.setLineWidth(width()-m_spaceBorder*2); + line.setPosition(QPoint(m_spaceBorder,linePos)); + linePos+=line.height(); + } + m_layout.endLayout(); +} + +bool TextItem::isNeedExpandContent() const +{ + QRegExp rx("$*\\{[^{]*\\}"); + return text().contains(rx); +} + +QString TextItem::expandDataFields(QString context) +{ + DataManager* dm=DataManager::instance(); + QRegExp rx("\\$D\\{[^\\{]*\\}"); + if (context.contains(rx)){ + + while ((rx.indexIn(context))!=-1){ + QString field=rx.cap(0); + field.remove("$D{"); + field.remove("}"); + if (dm->isContainField(field)) { + context.replace(rx.cap(0),dm->fieldData(field).toString()); + } else { + context.replace(rx.cap(0),tr("Field %1 not found").arg(field)); + } + } + } + return context; +} + +void TextItem::initText() +{ + QTextOption to; + to.setAlignment(m_alignment); + to.setWrapMode(QTextOption::WordWrap); + m_text->setDocumentMargin(spaceBorderSize()); + m_text->setDefaultTextOption(to); + m_text->setDefaultFont(sceneFont()); + m_text->setTextWidth(rect().width()); + m_textSize=m_text->size(); +} + +void TextItem::setGeometry(QRectF rect) +{ + BaseDesignIntf::setGeometry(rect); + m_text->setTextWidth(width()); +} + +bool TextItem::isNeedUpdateSize() const +{ + return ((m_textSize.height()>geometry().height()||m_textSize.width()>geometry().width())&& + (autoHeight()||autoWidth())) + || isNeedExpandContent(); +} + +void TextItem::setSpaceBorderSize(int value) +{ + m_spaceBorder=value; + update(rect()); +} + +void TextItem::setAlignment(Qt::Alignment value) +{ + m_alignment=value; + m_layout.setTextOption(QTextOption(m_alignment)); + update(rect()); +} + +void TextItem::expandContent(RenderPass pass) +{ + QString context=text(); + switch(pass){ + case FirstPass: + context=expandDataFields(context); + break; + case SecondPass:; + } + setText(context); +} + +bool TextItem::canBeSliced(int height) const +{ + return height>(m_text->begin().layout()->lineAt(0).height()); +} + +BaseDesignIntf *TextItem::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent) +{ + int linesHeight=0; + initText(); + QString tmpText=""; + TextItem* upperPart = dynamic_cast(cloneItem(itemMode(),owner,parent)); + + for (QTextBlock it=m_text->begin();it!=m_text->end();it=it.next()){ + for (int i=0;ilineCount();i++){ + linesHeight+=it.layout()->lineAt(i).height(); + if ((linesHeight>height)) {linesHeight-=it.layout()->lineAt(i).height(); goto loop_exit;} + tmpText+=it.text().mid(it.layout()->lineAt(i).textStart(),it.layout()->lineAt(i).textLength()); + } + } + loop_exit: + upperPart->setHeight(linesHeight); + QScopedPointer context(new HtmlContext(m_strText)); + upperPart->setText(context->extendTextByTags(tmpText,0)); + return upperPart; +} + +BaseDesignIntf *TextItem::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) +{ + TextItem* bottomPart = dynamic_cast(cloneItem(itemMode(),owner,parent)); + int linesHeight=0; + int curLine=0; + QTextBlock curBlock; + + QString tmpText=""; + + for (curBlock=m_text->begin();curBlock!=m_text->end();curBlock=curBlock.next()){ + for (curLine=0;curLinelineCount();curLine++){ + linesHeight+=curBlock.layout()->lineAt(curLine).height(); + if (linesHeight>height) {goto loop_exit;} + } + } + loop_exit:; + int textPos=0; + for (;curBlock!=m_text->end();curBlock=curBlock.next()){ + for (;curLinelineCount();curLine++){ + if (tmpText=="") textPos= curBlock.layout()->lineAt(curLine).textStart(); + tmpText+=curBlock.text().mid(curBlock.layout()->lineAt(curLine).textStart(), + curBlock.layout()->lineAt(curLine).textLength()); + } + } + QScopedPointer context(new HtmlContext(m_strText)); + bottomPart->setText(context->extendTextByTags(tmpText,textPos)); + return bottomPart; +} + +BaseDesignIntf *TextItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new TextItem(owner,parent); +} + +BaseDesignIntf *TextItem::cloneEmpty(int height, QObject *owner, QGraphicsItem *parent) +{ + TextItem* empty=dynamic_cast(cloneItem(itemMode(),owner,parent)); + empty->setText(""); + empty->setHeight(height); + return empty; +} + +void TextItem::objectLoadFinished() +{ + ItemDesignIntf::objectLoadFinished(); + initText(); +} + +void TextItem::setTextItemFont(QFont value) +{ + setFont(value); + m_text->setDefaultFont(sceneFont()); +} + +} + diff --git a/src/items/abordertextitem.h b/src/items/abordertextitem.h new file mode 100644 index 0000000..cc9bdee --- /dev/null +++ b/src/items/abordertextitem.h @@ -0,0 +1,110 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef ABORDERTEXTITEM_H +#define ABORDERTEXTITEM_H +#include +#include +#include +#include "aitemdesignintf.h" +#include + +#include + +namespace ArReport { + +class Tag; +class TextItem : public ArReport::ItemDesignIntf { + Q_OBJECT + Q_ENUMS(AutoWidth) + Q_PROPERTY(QString content READ text WRITE setText) + Q_PROPERTY(int margin READ spaceBorderSize WRITE setSpaceBorderSize) + Q_PROPERTY(Qt::Alignment alignment READ alignment() WRITE setAlignment) + Q_PROPERTY(AutoWidth autoWidth READ autoWidth() WRITE setAutoWidth()) + Q_PROPERTY(bool autoHeight READ autoHeight() WRITE setAutoHeight()) + Q_PROPERTY(QFont font READ font() WRITE setTextItemFont()) +public: + + enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength}; + + void Init(); + TextItem(QObject* owner,QGraphicsItem* parent); + TextItem(const QString& text,QObject* owner = 0, QGraphicsItem* parent = 0); + ~TextItem(); + + void paint(QPainter* ppainter, const QStyleOptionGraphicsItem*, QWidget*); + QString text() const; + void setText(QString value); + + void setSpaceBorderSize(int value); + int spaceBorderSize() const {return m_spaceBorder;} + + void setAlignment(Qt::Alignment value); + Qt::Alignment alignment(){return m_alignment;} + + virtual void setGeometry(QRectF rect); + virtual bool isNeedUpdateSize() const; + virtual void updateItemSize(RenderPass pass, int); + void expandContent(RenderPass pass); + + void setAutoHeight(bool value){m_autoHeight=value;} + bool autoHeight() const {return m_autoHeight;} + + void setAutoWidth(AutoWidth value){m_autoWidth=value;} + AutoWidth autoWidth() const {return m_autoWidth;} + + virtual bool canBeSliced(int height) const; + virtual bool isEmpty() const{return m_text->isEmpty();} + virtual BaseDesignIntf* cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent); + virtual BaseDesignIntf* cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent); + virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); + virtual BaseDesignIntf* cloneEmpty(int height, QObject *owner, QGraphicsItem *parent); + virtual void objectLoadFinished(); + + void setTextItemFont(QFont value); +protected: + void updateLayout(); + bool isNeedExpandContent() const; + QString expandDataFields(QString context); +private: + void initText(); +private: + QString m_strText; + int m_spaceBorder; + QTextLayout m_layout; + QTextDocument* m_text; + Qt::Alignment m_alignment; + bool m_autoHeight; + AutoWidth m_autoWidth; + QSizeF m_textSize; + QFont m_font; +}; + +} +#endif // ABORDERTEXTITEM_H diff --git a/src/items/editors/lrfonteditorwidget.cpp b/src/items/editors/lrfonteditorwidget.cpp new file mode 100644 index 0000000..2fbb96e --- /dev/null +++ b/src/items/editors/lrfonteditorwidget.cpp @@ -0,0 +1,147 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrfonteditorwidget.h" + +namespace LimeReport{ + +FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) + : ItemEditorWidget(reportEditor,title,parent), m_ignoreSlots(false) { + initEditor(); +} + +FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) + :ItemEditorWidget(reportEditor,parent), m_ignoreSlots(false) { + initEditor(); +} + +void FontEditorWidget::setItemEvent(BaseDesignIntf* item) +{ + + QVariant font=item->property("font"); + if (font.isValid()){ + updateValues(font.value()); + setEnabled(true); + } + +} + +void FontEditorWidget::initEditor() +{ + setIconSize(QSize(24,24)); + setAllowedAreas(Qt::TopToolBarArea); + setFloatable(false); + + m_fontNameEditor = new QFontComboBox(this); + m_fontNameEditor->setFontFilters(QFontComboBox::AllFonts); + connect(m_fontNameEditor,SIGNAL(currentFontChanged(QFont)),this,SLOT(slotFontChanged(QFont))); + addWidget(m_fontNameEditor); + + m_fontSizeModel.setStringList(QStringList()<<"6"<<"7"<<"8"<<"9"<<"10"<<"11"<<"12"<<"14"<<"16"<<"18"<<"20"<<"24"<<"28"<<"30"<<"36"<<"48"<<"64"<<"72"); + m_fontSizeEditor = new QComboBox(this); + m_fontSizeEditor->setModel(&m_fontSizeModel); + m_fontSizeEditor->setEditable(true); + connect(m_fontSizeEditor,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotFontSizeChanged(QString))); + addWidget(m_fontSizeEditor); + + addSeparator(); + setEnabled(false); + + m_fontBold = new QAction(tr("Font bold"),this); + m_fontBold->setIcon(QIcon(":/report/images/textBold")); + m_fontBold->setCheckable(true); + connect(m_fontBold,SIGNAL(toggled(bool)),this,SLOT(slotFontAttribsChanged(bool))); + addAction(m_fontBold); + + m_fontItalic = new QAction(tr("Font Italic"),this); + m_fontItalic->setIcon(QIcon(":/report/images/textItalic")); + m_fontItalic->setCheckable(true); + connect(m_fontItalic,SIGNAL(toggled(bool)),this,SLOT(slotFontAttribsChanged(bool))); + addAction(m_fontItalic); + + m_fontUnderline = new QAction(tr("Font Underline"),this); + m_fontUnderline->setIcon(QIcon(":/report/images/textUnderline")); + m_fontUnderline->setCheckable(true); + connect(m_fontUnderline,SIGNAL(toggled(bool)),this,SLOT(slotFontAttribsChanged(bool))); + addAction(m_fontUnderline); + + if (reportEditor()){ + connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), + this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); + } +} + +void FontEditorWidget::updateValues(const QFont& font) +{ + m_ignoreSlots=true; + m_fontNameEditor->setCurrentFont(font); + m_fontSizeEditor->setEditText(QString::number(font.pointSize())); + m_fontBold->setChecked(font.bold()); + m_fontItalic->setChecked(font.italic()); + m_fontUnderline->setChecked(font.underline()); + m_ignoreSlots=false; +} + + +void FontEditorWidget::slotFontChanged(const QFont &font) +{ + if (reportEditor() && !m_ignoreSlots) reportEditor()->setFont(font); +} + +void FontEditorWidget::slotFontSizeChanged(const QString &value) +{ + if (reportEditor() && !m_ignoreSlots){ + QFont resFont(m_fontNameEditor->currentFont()); + resFont.setPointSize(value.toInt()); + reportEditor()->setFont(resFont); + } +} + +void FontEditorWidget::slotFontAttribsChanged(bool) +{ + if (reportEditor()&& !m_ignoreSlots){ + QFont resFont(m_fontNameEditor->currentFont()); + resFont.setBold(m_fontBold->isChecked()); + resFont.setItalic(m_fontItalic->isChecked()); + resFont.setUnderline(m_fontUnderline->isChecked()); + reportEditor()->setFont(resFont); + } +} + +void FontEditorWidget::slotPropertyChanged(const QString &objectName, const QString &property, const QVariant& oldValue, const QVariant& newValue) +{ + Q_UNUSED(oldValue) + Q_UNUSED(newValue) + if (item()&&(item()->objectName()==objectName)&&(property=="font")){ + updateValues(item()->property("font").value()); + } +} + + +} //namespace LimeReport diff --git a/src/items/editors/lrfonteditorwidget.h b/src/items/editors/lrfonteditorwidget.h new file mode 100644 index 0000000..eb7864e --- /dev/null +++ b/src/items/editors/lrfonteditorwidget.h @@ -0,0 +1,73 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRFONTEDITORWIDGET_H +#define LRFONTEDITORWIDGET_H + +#include +#include +#include +#include + +#include "lrreportdesignwidget.h" +#include "lritemeditorwidget.h" + +namespace LimeReport{ + +class FontEditorWidget :public ItemEditorWidget{ + Q_OBJECT +public: + explicit FontEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); + explicit FontEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); +protected: + void setItemEvent(BaseDesignIntf *item); +private slots: + void slotFontChanged(const QFont& font); + void slotFontSizeChanged(const QString& value); + void slotFontAttribsChanged(bool); + void slotPropertyChanged(const QString& objectName, const QString& property, const QVariant &oldValue, const QVariant &newValue); +private: + void initEditor(); + void updateValues(const QFont &font); + + QFontComboBox* m_fontNameEditor; + QComboBox* m_fontSizeEditor; + QStringListModel m_fontSizeModel; + + QAction* m_fontBold; + QAction* m_fontItalic; + QAction* m_fontUnderline; + + bool m_ignoreSlots; + +}; + +} //namespace LimeReport + +#endif // LRFONTEDITORWIDGET_H diff --git a/src/items/editors/lritemeditorwidget.cpp b/src/items/editors/lritemeditorwidget.cpp new file mode 100644 index 0000000..d335697 --- /dev/null +++ b/src/items/editors/lritemeditorwidget.cpp @@ -0,0 +1,91 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lritemeditorwidget.h" + +namespace LimeReport{ + +ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) + :QToolBar(title,parent), m_reportEditor(reportEditor), m_item(0), m_page(0) +{ +} + +ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) + :QToolBar(parent), m_reportEditor(reportEditor), m_item(0), m_page(0) +{ +} + +ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) + :QToolBar(title,parent), m_reportEditor(0), m_item(0), m_page(page) +{ +} + +ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, QWidget* parent) + :QToolBar(parent), m_reportEditor(0), m_item(0), m_page(page) +{ +} + +void ItemEditorWidget::setItem(BaseDesignIntf* item) +{ + if (m_item!=item){ + if (m_item) m_item->disconnect(this); + m_item=item; + connect(m_item,SIGNAL(destroyed(QObject*)),this,SLOT(slotItemDestroyed(QObject*))); + connect(m_item,SIGNAL(propertyChanged(QString,QVariant,QVariant)), + this,SLOT(slotPropertyChanged(QString,QVariant,QVariant))); + setEnabled(false); + setItemEvent(item); + } +} + +void ItemEditorWidget::properyChangedEvent(const QString& propertName, const QVariant& oldValue, const QVariant& newValue) +{ + Q_UNUSED(propertName) + Q_UNUSED(oldValue) + Q_UNUSED(newValue) +} + +void ItemEditorWidget::slotItemDestroyed(QObject* item) +{ + if (item==m_item) { + m_item = 0; + setEnabled(false); + } +} + +void ItemEditorWidget::slotPropertyChanged(const QString& propertName, const QVariant& oldValue, const QVariant& newValue) +{ + properyChangedEvent(propertName,oldValue,newValue); +} + +} + + + + diff --git a/src/items/editors/lritemeditorwidget.h b/src/items/editors/lritemeditorwidget.h new file mode 100644 index 0000000..5214756 --- /dev/null +++ b/src/items/editors/lritemeditorwidget.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRITEMEDITORWIDGET_H +#define LRITEMEDITORWIDGET_H + +#include +#include "lrreportdesignwidget.h" + +namespace LimeReport { + +class ItemEditorWidget : public QToolBar +{ + Q_OBJECT +public: + explicit ItemEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); + explicit ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); + explicit ItemEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); + explicit ItemEditorWidget(PageDesignIntf* page, QWidget *parent = 0); + + void setItem(BaseDesignIntf *item); + void setReportEditor(ReportDesignWidget* editor){m_reportEditor = editor;} +protected: + virtual void setItemEvent(BaseDesignIntf*){} + virtual void properyChangedEvent(const QString& propertName, const QVariant& oldValue, const QVariant& newValue); + BaseDesignIntf* item(){return m_item;} + ReportDesignWidget* reportEditor(){return m_reportEditor;} + PageDesignIntf* page(){return m_page;} +private slots: + void slotItemDestroyed(QObject* item); + void slotPropertyChanged(const QString& propertName, const QVariant& oldValue, const QVariant& newValue); +private: + ReportDesignWidget* m_reportEditor; + BaseDesignIntf* m_item; + PageDesignIntf* m_page; +}; + +} // namespace LimeReport +#endif // LRITEMEDITORWIDGET_H diff --git a/src/items/editors/lritemsaligneditorwidget.cpp b/src/items/editors/lritemsaligneditorwidget.cpp new file mode 100644 index 0000000..e4c681f --- /dev/null +++ b/src/items/editors/lritemsaligneditorwidget.cpp @@ -0,0 +1,171 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lritemsaligneditorwidget.h" + +namespace LimeReport{ + +ItemsAlignmentEditorWidget::ItemsAlignmentEditorWidget(LimeReport::ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) + :QToolBar(title,parent), m_reportEditor(reportEditor), m_page(0) +{ + initEditor(); +} + +ItemsAlignmentEditorWidget::ItemsAlignmentEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) + :QToolBar(parent), m_reportEditor(reportEditor), m_page(0) +{ + initEditor(); +} + +ItemsAlignmentEditorWidget::ItemsAlignmentEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) + :QToolBar(title,parent), m_reportEditor(0), m_page(page) +{ + initEditor(); +} + +ItemsAlignmentEditorWidget::ItemsAlignmentEditorWidget(PageDesignIntf* page, QWidget* parent) + :QToolBar(parent), m_reportEditor(0), m_page(page) +{ + initEditor(); +} + +void ItemsAlignmentEditorWidget::slotBrinToFront() +{ + if (m_reportEditor) m_reportEditor->brinToFront(); + if (m_page) m_page->bringToFront(); +} + +void ItemsAlignmentEditorWidget::slotSendToBack() +{ + if (m_reportEditor) m_reportEditor->sendToBack(); + if (m_page) m_page->sendToBack(); +} + +void ItemsAlignmentEditorWidget::slotAlignToLeft() +{ + if (m_reportEditor) m_reportEditor->alignToLeft(); + if (m_page) m_page->alignToLeft(); +} + +void ItemsAlignmentEditorWidget::slotAlignToRight() +{ + if (m_reportEditor) m_reportEditor->alignToRight(); + if (m_page) m_page->alignToRigth(); +} + +void ItemsAlignmentEditorWidget::slotAlignToVCenter() +{ + if (m_reportEditor) m_reportEditor->alignToVCenter(); + if (m_page) m_page->alignToVCenter(); +} + +void ItemsAlignmentEditorWidget::slotAlignToTop() +{ + if (m_reportEditor) m_reportEditor->alignToTop(); + if (m_page) m_page->alignToTop(); +} + +void ItemsAlignmentEditorWidget::slotAlignToBottom() +{ + if (m_reportEditor) m_reportEditor->alignToBottom(); + if (m_page) m_page->alignToBottom(); +} + +void ItemsAlignmentEditorWidget::slotAlignToHCenter() +{ + if (m_reportEditor) m_reportEditor->alignToHCenter(); + if (m_page) m_page->alignToHCenter(); +} + +void ItemsAlignmentEditorWidget::slotSameHeight() +{ + if (m_reportEditor) m_reportEditor->sameHeight(); + if (m_page) m_page->sameHeight(); +} + +void ItemsAlignmentEditorWidget::slotSameWidth() +{ + if (m_reportEditor) m_reportEditor->sameWidth(); + if (m_page) m_page->sameWidth(); +} + +void ItemsAlignmentEditorWidget::initEditor() +{ + m_bringToFront = new QAction(tr("Bring to top"),this); + m_bringToFront->setIcon(QIcon(":/report/images/bringToTop")); + connect(m_bringToFront,SIGNAL(triggered()),this,SLOT(slotBrinToFront())); + addAction(m_bringToFront); + + m_sendToBack = new QAction(tr("Send to back"),this); + m_sendToBack->setIcon(QIcon(":/report/images/sendToBack")); + connect(m_sendToBack,SIGNAL(triggered()),this,SLOT(slotSendToBack())); + addAction(m_sendToBack); + + m_alignToLeft = new QAction(tr("Align to left"),this); + m_alignToLeft->setIcon(QIcon(":/report/images/alignToLeft")); + connect(m_alignToLeft,SIGNAL(triggered()),this,SLOT(slotAlignToLeft())); + addAction(m_alignToLeft); + + m_alignToRight = new QAction(tr("Align to right"),this); + m_alignToRight->setIcon(QIcon(":/report/images/alignToRight")); + connect(m_alignToRight,SIGNAL(triggered()),this,SLOT(slotAlignToRight())); + addAction(m_alignToRight); + + m_alignToVCenter = new QAction(tr("Align to vertical center"),this); + m_alignToVCenter->setIcon(QIcon(":/report/images/alignToVCenter")); + connect(m_alignToVCenter,SIGNAL(triggered()),this,SLOT(slotAlignToVCenter())); + addAction(m_alignToVCenter); + + m_alignToTop = new QAction(tr("Align to top"),this); + m_alignToTop->setIcon(QIcon(":/report/images/alignToTop")); + connect(m_alignToTop,SIGNAL(triggered()),this,SLOT(slotAlignToTop())); + addAction(m_alignToTop); + + m_alignToBottom = new QAction(tr("Align to bottom"),this); + m_alignToBottom->setIcon(QIcon(":/report/images/alignToBottom")); + connect(m_alignToBottom,SIGNAL(triggered()),this,SLOT(slotAlignToBottom())); + addAction(m_alignToBottom); + + m_alignToHCenter = new QAction(tr("Align to horizontal center"),this); + m_alignToHCenter->setIcon(QIcon(":/report/images/alignToHCenter")); + connect(m_alignToHCenter,SIGNAL(triggered()),this,SLOT(slotAlignToHCenter())); + addAction(m_alignToHCenter); + + m_sameHeight = new QAction(tr("Set same height"),this); + m_sameHeight->setIcon(QIcon(":/report/images/sameHeight")); + connect(m_sameHeight,SIGNAL(triggered()),this,SLOT(slotSameHeight())); + addAction(m_sameHeight); + + m_sameWidth = new QAction(tr("Set same width"),this); + m_sameWidth->setIcon(QIcon(":/report/images/sameWidth")); + connect(m_sameWidth,SIGNAL(triggered()),this,SLOT(slotSameWidth())); + addAction(m_sameWidth); +} + +} //namespace LimeReport diff --git a/src/items/editors/lritemsaligneditorwidget.h b/src/items/editors/lritemsaligneditorwidget.h new file mode 100644 index 0000000..3dda383 --- /dev/null +++ b/src/items/editors/lritemsaligneditorwidget.h @@ -0,0 +1,77 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRITEMSALIGNEDITORWIDGET_H +#define LRITEMSALIGNEDITORWIDGET_H + +#include "lrreportdesignwidget.h" +#include +#include + +namespace LimeReport{ + +class ItemsAlignmentEditorWidget : public QToolBar +{ + Q_OBJECT +public: + explicit ItemsAlignmentEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); + explicit ItemsAlignmentEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); + explicit ItemsAlignmentEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); + explicit ItemsAlignmentEditorWidget(PageDesignIntf* page, QWidget *parent = 0); +private slots: + void slotBrinToFront(); + void slotSendToBack(); + void slotAlignToLeft(); + void slotAlignToRight(); + void slotAlignToVCenter(); + void slotAlignToTop(); + void slotAlignToBottom(); + void slotAlignToHCenter(); + void slotSameHeight(); + void slotSameWidth(); +private: + void initEditor(); + ReportDesignWidget* m_reportEditor; + PageDesignIntf* m_page; + + QAction* m_bringToFront; + QAction* m_sendToBack; + QAction* m_alignToLeft; + QAction* m_alignToRight; + QAction* m_alignToVCenter; + QAction* m_alignToTop; + QAction* m_alignToBottom; + QAction* m_alignToHCenter; + QAction* m_sameHeight; + QAction* m_sameWidth; +}; + +} //namespace LimeReport + +#endif // LRITEMSALIGNEDITORWIDGET_H diff --git a/src/items/editors/lritemsborderseditorwidget.cpp b/src/items/editors/lritemsborderseditorwidget.cpp new file mode 100644 index 0000000..4597b06 --- /dev/null +++ b/src/items/editors/lritemsborderseditorwidget.cpp @@ -0,0 +1,154 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lritemsborderseditorwidget.h" +#include + +namespace LimeReport{ + +ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) + : ItemEditorWidget(reportEditor,title,parent), m_changing(false) +{ + initEditor(); +} + +ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) + : ItemEditorWidget(reportEditor,parent), m_changing(false) +{ + initEditor(); +} + +void ItemsBordersEditorWidget::setItemEvent(BaseDesignIntf* item) +{ + QVariant borders=item->property("borders"); + if (borders.isValid()){ + updateValues((BaseDesignIntf::BorderLines)borders.toInt()); + setEnabled(true); + } +} + +void ItemsBordersEditorWidget::properyChangedEvent(const QString& property, const QVariant& oldValue, const QVariant& newValue) +{ + Q_UNUSED(oldValue) + if (property == "borders"){ + m_changing = true; + updateValues((BaseDesignIntf::BorderLines)newValue.toInt()); + m_changing = false; + } +} + +void ItemsBordersEditorWidget::noBordesClicked() +{ + if (reportEditor()) + reportEditor()->setBorders(0); + updateValues(0); +} + +void ItemsBordersEditorWidget::allBordesClicked() +{ + int borders = BaseDesignIntf::LeftLine | + BaseDesignIntf::RightLine | + BaseDesignIntf::TopLine | + BaseDesignIntf::BottomLine; + + updateValues((BaseDesignIntf::BorderLines)borders); + if (reportEditor()) + reportEditor()->setBorders((BaseDesignIntf::BorderLines)borders); +} + +void ItemsBordersEditorWidget::buttonClicked(bool) +{ + if (!m_changing&&reportEditor()) + reportEditor()->setBorders(createBorders()); +} + +void ItemsBordersEditorWidget::initEditor() +{ + + m_topLine = new QAction(tr("Top line"),this); + m_topLine->setIcon(QIcon(":/report/images/topLine")); + m_topLine->setCheckable(true); + connect(m_topLine,SIGNAL(toggled(bool)),this,SLOT(buttonClicked(bool))); + addAction(m_topLine); + + m_bottomLine = new QAction(tr("Top line"),this); + m_bottomLine->setIcon(QIcon(":/report/images/bottomLine")); + m_bottomLine->setCheckable(true); + connect(m_bottomLine,SIGNAL(toggled(bool)),this,SLOT(buttonClicked(bool))); + addAction(m_bottomLine); + + m_leftLine = new QAction(tr("Top line"),this); + m_leftLine->setIcon(QIcon(":/report/images/leftLine")); + m_leftLine->setCheckable(true); + connect(m_leftLine,SIGNAL(toggled(bool)),this,SLOT(buttonClicked(bool))); + addAction(m_leftLine); + + m_rightLine = new QAction(tr("Top line"),this); + m_rightLine->setIcon(QIcon(":/report/images/rightLine")); + m_rightLine->setCheckable(true); + connect(m_rightLine,SIGNAL(toggled(bool)),this,SLOT(buttonClicked(bool))); + addAction(m_rightLine); + + addSeparator(); + + m_noLines = new QAction(tr("No borders"),this); + m_noLines->setIcon(QIcon(":/report/images/noLines")); + connect(m_noLines,SIGNAL(triggered()),this,SLOT(noBordesClicked())); + addAction(m_noLines); + + m_allLines = new QAction(tr("All borders"),this); + m_allLines->setIcon(QIcon(":/report/images/allLines")); + connect(m_allLines,SIGNAL(triggered()),this,SLOT(allBordesClicked())); + addAction(m_allLines); + + setEnabled(false); + +} + +void ItemsBordersEditorWidget::updateValues(BaseDesignIntf::BorderLines borders) +{ + m_changing = true; + m_topLine->setChecked(borders&BaseDesignIntf::TopLine); + m_bottomLine->setChecked(borders&BaseDesignIntf::BottomLine); + m_leftLine->setChecked(borders&BaseDesignIntf::LeftLine); + m_rightLine->setChecked(borders&BaseDesignIntf::RightLine); + m_changing = false; +} + +BaseDesignIntf::BorderLines ItemsBordersEditorWidget::createBorders() +{ + int borders = 0; + borders += (m_topLine->isChecked())?BaseDesignIntf::TopLine:0; + borders += (m_bottomLine->isChecked())?BaseDesignIntf::BottomLine:0; + borders += (m_leftLine->isChecked())?BaseDesignIntf::LeftLine:0; + borders += (m_rightLine->isChecked())?BaseDesignIntf::RightLine:0; + return (BaseDesignIntf::BorderLines)borders; +} + +} //namespace LimeReport diff --git a/src/items/editors/lritemsborderseditorwidget.h b/src/items/editors/lritemsborderseditorwidget.h new file mode 100644 index 0000000..296107e --- /dev/null +++ b/src/items/editors/lritemsborderseditorwidget.h @@ -0,0 +1,67 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRITEMSBORDERSEDITORWIDGET_H +#define LRITEMSBORDERSEDITORWIDGET_H + +#include +#include "lrreportdesignwidget.h" +#include "lritemeditorwidget.h" + +namespace LimeReport{ + +class ItemsBordersEditorWidget : public ItemEditorWidget +{ + Q_OBJECT +public: + explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); + explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); +private slots: + void noBordesClicked(); + void allBordesClicked(); + void buttonClicked(bool); +protected: + void setItemEvent(BaseDesignIntf *item); + void properyChangedEvent(const QString &property, const QVariant &oldValue, const QVariant &newValue); +private: + void initEditor(); + void updateValues(BaseDesignIntf::BorderLines borders); + BaseDesignIntf::BorderLines createBorders(); + QAction* m_noLines; + QAction* m_leftLine; + QAction* m_rightLine; + QAction* m_topLine; + QAction* m_bottomLine; + QAction* m_allLines; + bool m_changing; +}; + +}//namespace LimeReport + +#endif // LRITEMSBORDERSEDITORWIDGET_H diff --git a/src/items/editors/lrtextalignmenteditorwidget.cpp b/src/items/editors/lrtextalignmenteditorwidget.cpp new file mode 100644 index 0000000..652f678 --- /dev/null +++ b/src/items/editors/lrtextalignmenteditorwidget.cpp @@ -0,0 +1,190 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrtextalignmenteditorwidget.h" + +namespace LimeReport{ + +TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) + :ItemEditorWidget(reportEditor,title,parent), m_textAttibutesIsChanging(false) +{ + initEditor(); +} + +TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) + :ItemEditorWidget(reportEditor,parent), m_textAttibutesIsChanging(false) +{ + initEditor(); +} + +TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) + :ItemEditorWidget(page,title,parent), m_textAttibutesIsChanging(false) +{ + initEditor(); +} + +TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, QWidget* parent) + :ItemEditorWidget(page,parent), m_textAttibutesIsChanging(false) +{ + initEditor(); +} + +void TextAlignmentEditorWidget::setItemEvent(BaseDesignIntf *item) +{ + QVariant align=item->property("alignment"); + if (align.isValid()){ + updateValues(Qt::Alignment(align.value())); + setEnabled(true); + } +} + +void TextAlignmentEditorWidget::initEditor() +{ + m_textAliginLeft = new QAction(tr("Text align left"),this); + m_textAliginLeft->setIcon(QIcon(":/report/images/textAlignHLeft")); + m_textAliginLeft->setCheckable(true); + connect(m_textAliginLeft,SIGNAL(toggled(bool)),this,SLOT(slotTextHAttribsChanged(bool))); + addAction(m_textAliginLeft); + + m_textAliginHCenter = new QAction(tr("Text align center"),this); + m_textAliginHCenter->setIcon(QIcon(":/report/images/textAlignHCenter")); + m_textAliginHCenter->setCheckable(true); + connect(m_textAliginHCenter,SIGNAL(toggled(bool)),this,SLOT(slotTextHAttribsChanged(bool))); + addAction(m_textAliginHCenter); + + m_textAliginRight = new QAction(tr("Text align right"),this); + m_textAliginRight->setIcon(QIcon(":/report/images/textAlignHRight")); + m_textAliginRight->setCheckable(true); + connect(m_textAliginRight,SIGNAL(toggled(bool)),this,SLOT(slotTextHAttribsChanged(bool))); + addAction(m_textAliginRight); + + m_textAliginJustify = new QAction(tr("Text align justify"),this); + m_textAliginJustify->setIcon(QIcon(":/report/images/textAlignHJustify")); + m_textAliginJustify->setCheckable(true); + connect(m_textAliginJustify,SIGNAL(toggled(bool)),this,SLOT(slotTextHAttribsChanged(bool))); + addAction(m_textAliginJustify); + + addSeparator(); + + m_textAliginTop = new QAction(tr("Text align top"),this); + m_textAliginTop->setIcon(QIcon(":/report/images/textAlignVTop")); + m_textAliginTop->setCheckable(true); + connect(m_textAliginTop,SIGNAL(toggled(bool)),this,SLOT(slotTextVAttribsChanged(bool))); + addAction(m_textAliginTop); + + m_textAliginVCenter = new QAction(tr("Text align center"),this); + m_textAliginVCenter->setIcon(QIcon(":/report/images/textAlignVCenter")); + m_textAliginVCenter->setCheckable(true); + connect(m_textAliginVCenter,SIGNAL(toggled(bool)),this,SLOT(slotTextVAttribsChanged(bool))); + addAction(m_textAliginVCenter); + + m_textAliginBottom = new QAction(tr("Text align bottom"),this); + m_textAliginBottom->setIcon(QIcon(":/report/images/textAlignVBottom")); + m_textAliginBottom->setCheckable(true); + connect(m_textAliginBottom,SIGNAL(toggled(bool)),this,SLOT(slotTextVAttribsChanged(bool))); + addAction(m_textAliginBottom); + + if (reportEditor()){ + connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), + this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); + } + if (page()){ + connect(page(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), + this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); + } + setEnabled(false); +} + +void TextAlignmentEditorWidget::updateValues(const Qt::Alignment &align) +{ + m_textAttibutesIsChanging=true; + m_textAliginLeft->setChecked((align & Qt::AlignLeft)==Qt::AlignLeft); + m_textAliginRight->setChecked((align & Qt::AlignRight)==Qt::AlignRight); + m_textAliginHCenter->setChecked((align & Qt::AlignHCenter)==Qt::AlignHCenter); + m_textAliginJustify->setChecked((align & Qt::AlignJustify)==Qt::AlignJustify); + m_textAliginTop->setChecked((align & Qt::AlignTop)==Qt::AlignTop); + m_textAliginVCenter->setChecked((align & Qt::AlignVCenter)==Qt::AlignVCenter); + m_textAliginBottom->setChecked((align & Qt::AlignBottom)==Qt::AlignBottom); + m_textAttibutesIsChanging=false; +} + +Qt::Alignment TextAlignmentEditorWidget::createAlignment() +{ + Qt::Alignment align = 0 ; + if (m_textAliginLeft->isChecked()) align |= Qt::AlignLeft; + if (m_textAliginHCenter->isChecked()) align |= Qt::AlignHCenter; + if (m_textAliginRight->isChecked()) align |= Qt::AlignRight; + if (m_textAliginJustify->isChecked()) align |= Qt::AlignJustify; + if (m_textAliginTop->isChecked()) align |= Qt::AlignTop; + if (m_textAliginVCenter->isChecked()) align |= Qt::AlignVCenter; + if (m_textAliginBottom->isChecked()) align |= Qt::AlignBottom; + return align; +} + +void TextAlignmentEditorWidget::slotTextHAttribsChanged(bool) +{ + if (m_textAttibutesIsChanging) return; + m_textAttibutesIsChanging = true; + + m_textAliginLeft->setChecked(sender()==m_textAliginLeft); + m_textAliginHCenter->setChecked(sender()==m_textAliginHCenter); + m_textAliginRight->setChecked(sender()==m_textAliginRight); + m_textAliginJustify->setChecked(sender()==m_textAliginJustify); + + if (reportEditor()) reportEditor()->setTextAlign(createAlignment()); + if (page()) page()->setTextAlign(createAlignment()); + m_textAttibutesIsChanging = false; +} + +void TextAlignmentEditorWidget::slotTextVAttribsChanged(bool) +{ + if (m_textAttibutesIsChanging) return; + m_textAttibutesIsChanging = true; + + m_textAliginTop->setChecked(sender()==m_textAliginTop); + m_textAliginVCenter->setChecked(sender()==m_textAliginVCenter); + m_textAliginBottom->setChecked(sender()==m_textAliginBottom); + + if (reportEditor()) reportEditor()->setTextAlign(createAlignment()); + if (page()) page()->setTextAlign(createAlignment()); + m_textAttibutesIsChanging = false; +} + +void TextAlignmentEditorWidget::slotPropertyChanged(const QString &objectName, const QString &property, const QVariant &oldValue, const QVariant &newValue) +{ + Q_UNUSED(oldValue) + Q_UNUSED(newValue) + + if (item()&&(item()->objectName()==objectName)&&(property=="alignment")){ + updateValues(Qt::Alignment(item()->property("alignment").value())); + } +} + + +} //namespace LimeReport diff --git a/src/items/editors/lrtextalignmenteditorwidget.h b/src/items/editors/lrtextalignmenteditorwidget.h new file mode 100644 index 0000000..93fd39d --- /dev/null +++ b/src/items/editors/lrtextalignmenteditorwidget.h @@ -0,0 +1,73 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRTEXTALIGNMENTEDITORWIDGET_H +#define LRTEXTALIGNMENTEDITORWIDGET_H + +#include "lrreportdesignwidget.h" +#include "lritemeditorwidget.h" +#include +#include + +namespace LimeReport{ + +class TextAlignmentEditorWidget:public ItemEditorWidget +{ + Q_OBJECT +public: + explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); + explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); + explicit TextAlignmentEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); + explicit TextAlignmentEditorWidget(PageDesignIntf* page, QWidget *parent = 0); +protected: + void setItemEvent(BaseDesignIntf *item); +private: + void initEditor(); + void updateValues(const Qt::Alignment& align); + Qt::Alignment createAlignment(); +private slots: + void slotTextHAttribsChanged(bool); + void slotTextVAttribsChanged(bool); + void slotPropertyChanged(const QString& objectName, const QString& property, const QVariant &oldValue, const QVariant &newValue); +private: + bool m_textAttibutesIsChanging; + + QAction* m_textAliginLeft; + QAction* m_textAliginRight; + QAction* m_textAliginHCenter; + QAction* m_textAliginJustify; + QAction* m_textAliginTop; + QAction* m_textAliginBottom; + QAction* m_textAliginVCenter; + +}; + +} //namespace LimeReport + +#endif // LRTEXTALIGNMENTEDITORWIDGET_H diff --git a/src/items/images/Control-Edit Box.png b/src/items/images/Control-Edit Box.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0fb75eb36f851eaca0a8099810725cf3105747 GIT binary patch literal 618 zcmV-w0+s!VP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-;7LS5RCwC#l}|`iQ5eO4_s(n^MvaLmZ6OE}7}VB{ zyLMJcU?4#>Q8vZ&XNZEd7a|Qcgp!%t7E!dZR<3jv(WWA-aN!~%qd}%j+?4nGTFkuX z{IMJtZxeo-`&};goO{l>?_Hy+gjtr5Yl~pRiawipA8N``053Zh3i#`(`$YnO^0yLI z#3@b$k=n7gSKiJo)R)2jgZ-NZ7m@lxmeNO9FZj^NLqr58x-o%o3sCpTKYz*NL~-sP z3NCsRBr|sdTL3P2<8<|0ssKE4a)4weS7FQ7d;#Yw6-28E?hKqloYHwX&CJsr0GCf6 zWwEeCPtxP@_;vcu4|64TjE?r!0Ne+yRuHYWrSDvp`A-Y{`n?(`XljTNk8R`o(lSnj z{NfKf+FKD(RJ8)sIaxnsQKkRtD5(?OJi2!+@V>Z7dG+Qadv@gTe~DWM4f>)<_l literal 0 HcmV?d00001 diff --git a/src/items/images/DataBand16.png b/src/items/images/DataBand16.png new file mode 100644 index 0000000000000000000000000000000000000000..e608b3b6cdc76a072543b19843a8c2a6e36c0c47 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfJsu`uDGT1PwUR&~TTd6q5R22v2@3=a7Jd9bc~w7a?6d#%f6@$$7Tr4OvQnJw z9z%~oLQaZIQe4839@j;SCKgJ#Dqn6$SLzopr0A>I$ Awg3PC literal 0 HcmV?d00001 diff --git a/src/items/images/GroupFooter16.png b/src/items/images/GroupFooter16.png new file mode 100644 index 0000000000000000000000000000000000000000..aac702717f3a2e80b051692ddadba398968c6ff4 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfJsu`uRimx3dDcK76Hgb%5R22v2@3=a7Jd9bc~w7a?6d#%f6@$$7Tr4OvQpfQ rS3-;}K}E%ErK$57Zjp4gE=Gp?OsuaT`SM-{>SyqD^>bP0l+XkKl*1}z literal 0 HcmV?d00001 diff --git a/src/items/images/GroupHeader16.png b/src/items/images/GroupHeader16.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a5c46a61e062c70086c927fb1d131f364af71e GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfJsu`uRTan1+gU&%J5LwK5R22v2@3=a7Jd9bc~w7aY+GoNY24iX^V=7Fn5prV zN%-pF2mkB;96WI1M8~512YU^&4lMBTNO`3!&%n@X%PC{~YGDY_BnD4cKbLh*2~7Zo C7But# literal 0 HcmV?d00001 diff --git a/src/items/images/PageFooter.png b/src/items/images/PageFooter.png new file mode 100644 index 0000000000000000000000000000000000000000..847d4ec2d7a9c92a3531fc6a1ab8c40d7f2ed217 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE(|jmTp5$VPoCt9+K4<&S=XoEv$)V8 i>);C3l5Ghum>Il-xHTo@BU6C}GkCiCxvX2BR0pdfpR zr>`sfJsu`uSxZv^ZV#Z4iKmNWh{fsTgarZyi$4CJysDoy_SygXKWPR=i*B8CSt;(u rDR@JYkz7m^*JBP(OpGtDnm{r-UW|a)v7r literal 0 HcmV?d00001 diff --git a/src/items/images/PageHeader.png b/src/items/images/PageHeader.png new file mode 100644 index 0000000000000000000000000000000000000000..afb768f96866413df39b418fe0ac9444263f222c GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE(|jmTp5y4@+~-ciIrzD b0~^DPea_SK&*=054P@|i^>bP0l+XkK=HNS9 literal 0 HcmV?d00001 diff --git a/src/items/images/PageHeader16.png b/src/items/images/PageHeader16.png new file mode 100644 index 0000000000000000000000000000000000000000..6c754366cdebf5f977314c454da7750c8ab90f51 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfJsu`uIbQqDHFiKDTTd6q5R22v2@3=a7Jd9bc~w7a?6YWA{mdKI;Vst0CSr! A`v3p{ literal 0 HcmV?d00001 diff --git a/src/items/images/ReportFooter.png b/src/items/images/ReportFooter.png new file mode 100644 index 0000000000000000000000000000000000000000..da8923f398aab94cf79325c4706e1b7a49dc0542 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4S-mN3j0xl(W)D8gCb z5n0T@z%2yAjF;}#{Q(NHmw5WRvftz87Sd5azT$)lP{_~I#WBR=cyfZos|LZ?gnyHM z{?{}#FjNyf>LZrZCA3KRgi+1GORN$}K3n(}1#-LTN-&8fq->ebZ7Gqa7vs3BP-bzV jLDs<)tjviAFR(MLImESN!-2&h7ch9b`njxgN@xNA_PIJM literal 0 HcmV?d00001 diff --git a/src/items/images/ReportFooter16.png b/src/items/images/ReportFooter16.png new file mode 100644 index 0000000000000000000000000000000000000000..33e923d754dd665635c0b5b214c05dd2c1de4cfe GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfJsu`uIkUbdS1F*7iKmNWh{fsTgarZyi$4CJysDoy_SygXKWPR=i*B8CSt;(u rDZ2C*JK;)GAh(2BR0pdfpR zr>`sfJsu`uIgOIuib|l6ou`Xqh{fsTgarZyi$4CJysDoyHm&V-(H<+~GWSIvW@>z8 z625x)!T2BR0pdfpR zr>`sfJsu`ub@f-}dAc};Se#BySRi1q=;Qy%tNK}EpZ%}@lV)JF=+;S>mEvx^ k5~c|S5)OrFizFBrUSzY%>SpED0Ch5Wy85}Sb4q9e0Pc?|TL1t6 literal 0 HcmV?d00001 diff --git a/src/items/images/SubDetailBand16.png b/src/items/images/SubDetailBand16.png new file mode 100644 index 0000000000000000000000000000000000000000..64cbe2f7646b29e4f9941187aa680cc2ce0a35f6 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0pdfpR zr>`sfJsu`uY4w?|6W0QTY&~5ZLo7}wCoB*!SoHD#EwvCsb3|4B12T6F8A%Sv&! zdkj4WI}V<(II`zJhh(>ltMX%mF1KZj=Y2$&8Sd=k{Nc0u*)52BR0pdfpR zr>`sfJsu`u8TPkX>WhFvCY~;iAr_~T6BY;?q ruY?#|g31!2BR0pdfpR zr>`sfJsu`uY4es(jVFOZmYyz-Ar_~T6BY;3 literal 0 HcmV?d00001 diff --git a/src/items/images/addBand1.png b/src/items/images/addBand1.png new file mode 100644 index 0000000000000000000000000000000000000000..b2941ff7ae397a1bc29ec3fb1b0dbb150548fada GIT binary patch literal 640 zcmV-`0)PF9P)V16eAktWPiIg>a1rMs9teH#;Flexutgjv#T?_CX2B3oUNhwSV2i5Y#; zh_o^yCj@z-X1f?p9)HhFT*RA4mq0?XrBnPv^cW>*f6cnHf~Ozvf!=&|9^W_DP-6RH zGxqk38G915zzhopH4`iKj8X}1{rUgjo>{e_voYwvi4z=$dIPF><)mVH*0i%` z_36#(F1UCiXM>!Wl4+801LsYKG^I=)!x@Z6E=eRcA7^FGXV9K#qG#Cl`oa~~;~PS{ zrbJzQy8f_Gvy8xf_Ear}I<}>bMdv4Es#wnWQ9B`SLf{{VGmT=QM;i7!{Ar$e=?#xS a0)yZNlOsK`dpm$mV(@hJb6Mw<&;$UP!c*}8 literal 0 HcmV?d00001 diff --git a/src/items/images/hlayout.png b/src/items/images/hlayout.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9523e153aecc4a3022a7890ae0af66d78f37a9 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYYs>cdx@v7EBhTTQ9%>l7=`|?Kq1Kz*N775{M_8syb=cIqSVBa)D(sC z%#sWRcTeAd@J2py1_nkIPZ!4!kK=Dct;1LxIdtxQW~yTJjd@=$<9mfU=Q8^Q&E|iM zx25wI-9EWzVWSq;490iQ&&xA59DiPZPibe}{*#9*G~<_Zw=bX0&v4-9=PN5V1WsCe zUOVN^iB0|tYuSVvI9eEDrv>FseLYXk^L1lyC8LOGLCjbP0l+XkKfN-kl literal 0 HcmV?d00001 diff --git a/src/items/images/hlayuot_3_24.png b/src/items/images/hlayuot_3_24.png new file mode 100644 index 0000000000000000000000000000000000000000..66cf271d60dd6e442b7f83e5f80552362c717945 GIT binary patch literal 430 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=CW!K$y{KjmZq4AbW|YuPggqW?2Sl4QUnQ#S9FL)}AhoAs)w*6C_?WOl)jyRLooS zvOZ^0_a}ejN0X8h5)ur4$)7FiD|{&*Qza=OArXKK&0fIXM#oHqa%Hp>cx_8 z=G-yhvDlI?-aLEu?N!CQrzc&letT={)~KkcgE}XK)~s2h!BzkN-&&^R%?6tiB0hb4 z8(kYyl~|;)i-m=ypiNcUSpD9HXV0D;)9OoNw6?bPW44Ic@iFSa;ls{1nC$HA=CBoP z{P1Wi!}K_{DD}&M+-|xOTO0Vq7Kn(>x2rw0^26=<=PP&*Efqi7q#wWUfysm8^Ve7C z9su#z$8VHAbn3*h53k>s?-6@&>2y;J_d}-Y?|BEaE$sI87#!;qRxdLE0Yk%&|9^jf zuiUe3!-fwQ)!*Kf_E`M<)*BiT@ng}nX<;AU-Q6v}==A4LpW?Oy6)dP+&BVZvmy)}B T;_h$2kY(_6^>bP0l+XkKd%wB7 literal 0 HcmV?d00001 diff --git a/src/items/images/imageItem.png b/src/items/images/imageItem.png new file mode 100644 index 0000000000000000000000000000000000000000..87053469770c3177aad541db4e51e05cd91ff31c GIT binary patch literal 26375 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�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 literal 0 HcmV?d00001 diff --git a/src/items/images/imageItem2.png b/src/items/images/imageItem2.png new file mode 100644 index 0000000000000000000000000000000000000000..02cda783ab0aaa028e34f424684afecd4230e83f GIT binary patch literal 1476 zcmV;#1v~nQP)5}?ku0ZoFgso(D1%4ToSPLt-y1qOJ{Cae04n*la&)g2k46& zHKN%OLC9u|Vo#+o$ySI>aZz9|4{$b@;9%%8j{NeK zVL9Hs(c5vXT$ldHJYA&C zQCt>{oStQxb{!FiIxm$={>wT2*7?*fKl8$w&$HiR>ZzAeE%c2>p=#_d3?^$Gt z@7f;P^9KOH${UnatEqpnTP>i-IgNZ<2~+a|RQQ()Zd(DN_)i>oW+~;fmjf^m3X+;1 zK(^b_Ol~TQZ{y(Tfkj`x+p+$VE_!=Q+4X6w?d7oMnd5SlNcYTKLreeXq_bz}UjGEs zXVozjI?O;QNap_Au{*sqf8Zt<&f~oo@8n?Hnyen{z4M_5TX&l-23Ya%v1XtO;MEW3 zkHoGTbUG9_Eo*BipS_&$FF^)EL3rS9%-%_SwAsPjsvB5RTgIV|D3Q!{l4=gu1G~kE zUSU&HKup-I4wpHfmNgfOi*+@aw0t~jA-64wuxn2{tvxXYk^&`KrI2(uZ@#Eae;2pd z-G1?ZP1|wYyoEMp76YLmrWMOjv?+M4#kedQ)2^9^B&6BB^9w%z<_9WDi-@a=?N0#) z!d=-zS5Z?_gQjT!C=b@5cqgM-i*Z^eVU-=2C6$f;nabKnhLExm95xxjIHzHn2oO)L zsIOhRjQ#uf)7{;TG9!rOo{ZOeIX2lzA`^xC8aWe+F}&^?N^hxW-SY~fY(@lQLcpfY zn~d6}wd3My*)dF>$#~R49EuyoWFdFo^Gv^e73Q8^njil!$%+n&cfQBz;xu3Ce}WH+S7}9-##p=!qDnjcx^=- zA85uB9p3Q=fY0Y^6a-;yb#*m)d3iK6G%#(B3!|uj*5EeoSoj#_l?(WP+nWG%y;eob zwh!6!a}Tj-g3GS0CKT_az5iRi?8lBrF97&_zDD4o>gsAbJ3EO+qo}g3r#vx=t$s$u zID=vvo!M_0PR9V4J#Q7+LI=rhtEd`mrChs_9mih5+aKPrV8d{7{3ZMS{uh9C3#Z9WP1Q>Xh`1~ocEv^SNE@G?e1nnwhj+j9 zblXZ`1W2DhD%^l)EbV|9km{cFZ}2TC3(P6}2l@7?xYa3S^)z-l4;`J(NGp4Lwvh<+ zB@Tbw^U$~ouhI)IVr ziVS`EcGu3}zL9r<(Xk9mvKY^0bX}O}zm{atoXhCK7)$}=vDGxzi~wYSvp`ak#T*dJ eWzNz6lK2(m%NUCE>Jotf0000xu4 zRvko@4^5>urA?wpZKKFaRHv>*r2=tKJ|wQx`je%)apFczBulN7hR8{)F1QY~M)d>H zT1}CHjq4Z-9A5jJxwju?2lm05-LPQyFI~;dz2}~L&OML&7_sfgeTrms4j%P)umo&B z*uP>tHGtZ6#WdHiUkd*;tQ1d2fr?_D*p=tOR*0uab)lvQr`cOMGfyBya)*TPOl@s} zwMq4lZw&GH#$Zl7Qr}J*q{Zny0cUd4vE&#y zcQ(Mevw@riI@H#Y6TMO@E#<<37En1^;M2bbc;ofX#R*gJ)1P(ZM4u@Jv{WLL6T{gS z7vnQ3sl0sf@PhS++S(xp{%%o9E$BuIWFhs{vQVZzxz=YuRzd7)m<#WxTc4%jv8J>> zuD_<%XQE#WS*6jh5(AZ0Ra910rPT{9u7JpnelcXU!1jav9qz~O2TBlYZ8mSsnSUBY z%5$ms%he)og*;82uDlw7!8iN?188@N`o>Bq8IyTg2j*NTPa5=IzaOA6UcmA8fCkW9 zzn)`1^gEObTk4)blALiE0H0l-0!HU5^D%2$h8S21Qso3!fg4kNc4I1Dm7l#(rYy7+ zB+Kc*7(D8q8{_!#<7&s&`ur%6@?0toe{C40RA*~zYe!=JlGA7=pV0k{S_qyvEOeg9c1E2}d0)5N^HDFre` z))hO@oO0>GdG3h*A*|IxQE-?oF^yffM^d1ey zLO1C9qK98!`2|AQ{Ak-x*j3U%sc$_o+o8KBkCYv6q`lFWCVZ7UjBIP zUA|lQBAVt{A?pK8CQX+`f%x;(;0Z2HoM+6q%!K(b&X4!jn1 z+;OI6XBi89!L*zPppY5Dp$N9L&@=-fa>_!>do7eWIqs_!mRQneGBOK5i4h|jvFGSD zV8@OfM5EEFc(*xCR?Gr|%&}!fC6+CjjyZR#F%iRxN3Yw@@Am^d1MCK#0tUf3&?MO9 zQ7)XhO5dk%I-Rq;IZmZJaV>ev+fX{jFJIozt>`V@8+wn|0n z^^J~HiE_bP2m9L-d9GfwW(3%D^5RKesy{&Acpv4Z4}cE3E-*BW-tkW`G=UI;{)qtP zW$W;1tGGQo#qjul`Su^4;pe+w;Zm@h=jz(nSyfaqr$G0>DBT02cN8jDB=VH;EtX|j zj7^VmJ2-{z)e#1mQm4@LAtcz+Mhc0PHc~1sPh8^0^f;5DFcB4DB0Nsiin&7wSAo=P zwLl)^PvU7wH3{r*scqqRe|w)j)q4mB!x)B6k#`j!5rr0mp+0;bgNKX!h?v2y;?>wi zl9-ejx`)q$m)Kdh2Y{$0KZcYa9Lop+3=K~VZ$5DP0B8Pw1{ssiEuawShTzGjuXD5b zpRDqF*b<o{ z`%T?^)YMHK@B@v~R?LKF(4|7xG-5K0tt38A0Y1am5A?(ZJ`a503cu0{fODJE9WMZf zfkq^Z2PZK@Aw0T<8T=B7v#8<-e>fAvl~y1XHh{-4m<-Mko|xwLY>4}UHfRD(Xmd1~ zaJLm00BCt+A0^fmPF|lt`AoKZ9-?mjR!rRsj@x8}cBjS_Kmhpnk#BZUQN0<%@KAAI zIdzo}@oGyKI05^?9XYt$)Vo-=E2aLU(s5NORlivOm0AZDg8=pckHp{q0er+F{tqj+ ckS!bj2U)3}I=UT7+5i9m07*qoM6N<$f|1vHt^fc4 literal 0 HcmV?d00001 diff --git a/src/items/images/insert-text_1.png b/src/items/images/insert-text_1.png new file mode 100644 index 0000000000000000000000000000000000000000..86741ea651251c89e61c91cc3f0364f613d5f9c9 GIT binary patch literal 997 zcmV19gc65=}}t@Z-0G$&+nrpmmhvY zCT3n;#bMy;+AcWvtRh{Xc z{_?^s%FD}T!GM*`q*VSCObkLLbaNbs;^Jb{>!7oOxi%GOK8!$%UNL z04oVu(EzH*qd6c5LLLmj;tVM0)M5;%)WGCK0Fx5|)i=}A*ME2hq;+<0y~Kr7Sn%;f z0K-GiRBzts6Xbs+u@<3e$Aj)iisyU!o~Gix+I>Jh!w7AOxSrwQt|)Li6=j*?-8MACf%hYZmd`$|mMk zHsRB#0k_8kx5uMUIuON(cF=rH3}p5L;>LDe@&M7#Q&QO8-cIWY49x>67cwxXFt9ib zWq@IfXMj~35jD9GtZIM(BBmLQlI2CLXn+vsP0K)D)u>(#O)`<`X+c36nm4aUu(-H@ z@iDQ)_793x=iPf8UVOWt7;DXjvlUL1|4ygvNc#iFB zV01c!(dm%xnK+v$vyrUizRCHuwY7PMQDTg*Q;ix+&JPBI0D$guYj z98ek`^jj(1=>f0Ti*Pthq_5Y>zYuIZ5y#H%PHJ3n|2SH&H6ea-31vr%P!{#z?U!-< ze7p#!y-0j3K^Qn}j{Fmuk#N`?X*VMzC?c^4YyyRiVXz~_ke~vb_98f0r?yO7Pzb;p zzX8YA7VI_#4n7P46#0B>F@*tkmc<4iL2UgGen+=Z!Y2TRfFX=E4CrXOffKvGFtW4` z>U6+o_oBvi2@cy4Yc%zPH~pxrssqc~QCV^ZHEu5kI{f*CSF@K5|NUzf%Ny_)_?Ad% T<=^Bf00000NkvXXu0mjf+mgd# literal 0 HcmV?d00001 diff --git a/src/items/images/insert-text_2.png b/src/items/images/insert-text_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c1a640304de09f57f252d6cfaa40a8773e7280ec GIT binary patch literal 1480 zcmV;(1vmPMP)NmP0~D-CQ41(MvW3nReY?1D7X*`MXHD^SLs3*f(ua> z+Kto-g4RXBor|hLaa)^*ZD|SWBCSHxn|sreY7^RT5vOd`nlv&wjft^d9BR7M&Pp9} zq~lP8ML90*IK%@)Fbq?@|7-Uzg$S4cFm>Su#t*A80B0?$Az(Ga|0V>m)(qq_2SCmM z09adFqsErNRtW0BdYB3jo%-Dp00xn$Y$$z)L4lnS&f3FxJI}N-@21ElL2003piiGqfn> z0anohP+i%U>LwsGL1_Y=dhek!8Fa# z`rEdRmtT1m9UZ%&RE#N9b{++YX#wd}5om!D(J1`HEO zC0Fp?yOa27>U*4BEtu$1wEZL&yS+j1sMVHQy+z)x4E3K`q zXlrXN9%5nkBH93j7E-G~d)`iAMy5gq)S?Xvjy9R5fiPO&*591|qtJFlI*F_L9GA-| zApDW(2UQOU1nMBgaJy0{wl)3P=*|?=*V}Lq&C=}N$BXkN; zY#ULm%6oA%vmVnQs)!=R*Z10z2|DF6g}u-U+#I4^zejW}|+tCT`RJuN`Cys6)e4YmXh9z2L2rhbl;4!jA} z8@<1|WWdyg8`!tMk_K!Zg-jocD7AOGP{;xhK}F06KkDK7IK!5f*U!-(EM3$!kmStgmeI2tiGx%+8uJ}^rB0+x_ z2WL9|k8FlvU~q6yc^W`ObIklqCXAz?D;{iR(Q57%QaNY@5{V1 iVAD@_{8(kj8}J{c(a0uG%co=j0000)$5Kbt}AsqQCIJ2)ovN2AfiU=P?7Aq6mikhJ3Z&< zffLv&RqgilOn1L|?@9XCAM(qG&E}h=@2_<3#gF^@Pm=Ve3I6=j_cxN{lj?KdG;x*h zSh>2qyw35qfXu9HR`W)i$edQ5AAal$ExXsMGBYa7Ez zVJb2N!%p0R$%8TzT*sTDKw^W9Qq4{y@!caY4h})sGDJ4gC`A>F zCXc*Av@&GS_rx6p-zj>a=z&?qkL&|qrYY71)eIS3p&iy~yWN(&hutpdX%^~-=Dk~( z0J3aD`c&z!*XxqETCMc_^pw*IO&yN(HfwgGxrwyta5&65Xa;DGL9Rkz{SV&^V`?@ f%art4|HbnMVdR}|>xB(=00000NkvXXu0mjf$yyMw literal 0 HcmV?d00001 diff --git a/src/items/images/insert-text_5.png b/src/items/images/insert-text_5.png new file mode 100644 index 0000000000000000000000000000000000000000..e745fbd7a4dcd8936f0f1fab134ff0b6af8b9714 GIT binary patch literal 598 zcmV-c0;&CpP)MjvBwC42PL?VWC<`CGheHxe1(iwGLX}J|mI+i{RQ-Xo!w=1>X1+XqR`-sF zoS3vk9@aQm<4_h3<(dNkJlfcL^LqKb4t9&>i+Z;G_y_<><4_hJ)>N>Chc$jWg9lxc zb>45!U)2#I1;g&a{PxMgyapn7qhzHeG7gH+A*M^{E#w9%qmwV2X(xH=_1C6N4l6#e?^;$5)&dGlpacKf+)Y24~j z(c;++HC5lM%j;S=K6N5Jykk^YQ%#I6DiG7Zq5Pa6JH5%qM~a{+8l9Wr22%~l;WQdx kdfzJ%*gt;Q;Qz|jA9v4n-#h!R+5i9m07*qoM6N<$g1O-T=l}o! literal 0 HcmV?d00001 diff --git a/src/items/images/settings.png b/src/items/images/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..9003698ffa2e34c776758350455e75f9faf886c6 GIT binary patch literal 509 zcmV`XQX^5}iiQwu=^h1lWM#xPOtaeE_ujmj*@c#H_qQR0 zH*J_C0w;h)`wp-Qtd7Uyg@|J{c2B_F6G_|d{=(gt0II6GF6jVpu;1@*0AyLV971?m zV-uo`7D9LioCT)94sdwR?Kd+!Bq;@+=Xrh(P-8{2+3Xsy3+ywqMc|>N(`I%C*fg`n zn!IafR{_Ni00<#`HM1jCRb4EK;^|yNF9A=0iMt%w3^+9!jeeA6`5vGXLihk2uk9geYo6SMq%AYMBI%yH-;wk&AsQt>k|g?NF^@5pQmSp@M z6gQI`dV=ZW}%PdMLq1 zkwioiF)#jw@20CC#Kr6Im!G{*!6S)AGc&(ElX>q_=&ab&;m+)M_z;R+7QrGcj5Yn< zbyJO>{W%N3<9#bxzV-f{MN@dFoU=NWO!dm$&JkB>R3O1)wF`C2&OYDqR{u}kPpB`& z7uNLjJ$bEo^_4(^+O%#Hh^P%Kq4kS_ol2=rYwcoS2Y{m-8r%i5N-3KQ=UR+4l;g(* znFcQL@`+EYLRT$$R+)3D%I%&n;p-@9Mvfm>-&3`NZszSYC#kPr+7t};7 zTQCbyN};w)4lD)M1FeG8Yjj!=rO}P0p!5=;lkwyyz@Hjz1u1BB0k{GD=;mf~|D>DJ zmmTHIXmkS*)956SNX1jTYUIxYzD5T?!B{g}yj9Ho3oMCju4AdPpa1{>07*qoM6N<$ Ef@b;;#jr>%mK8D4|zPn)0&WJ z97((%#W###9t(qokI!(mrohS`@G-2#4`i)Al_iIdV*!iE&}sD&tK$Yye)4>)3+5n8MF6bt}$c9gc_aUva4d{sI@! z!3?%x6IK-lb`me6O&gWyCLZ8&lql;`^XE8;drbt!urYR+8=9pIjd+LGI8;~QJdT#S zWv&Z6kJ~t1M_?2u60Ml^fWxQoV&JJ^LciEgQL zWPk3aQl8K+v9oqXS&Fd_k9%c4f$fp`6s|O!_FLGW+ExcU3q!Oz%JL8gYQiUDebSU+ zY{rIC%}4MS2P@!v@G90Pjad;QLkWL|W14SZN9o&cT*D)*sq@1g=&@!3ckmt`@d0-m cl(4_?8@LZ_!^Kq2o&W#<07*qoM6N<$f=Tu2)Bpeg literal 0 HcmV?d00001 diff --git a/src/items/images/shape4.png b/src/items/images/shape4.png new file mode 100644 index 0000000000000000000000000000000000000000..cc74953c4d14de025dc2c50bc46d672505270945 GIT binary patch literal 636 zcmV-?0)zdDP)xFl@ibx&#v;-`33vyaakh&*tBCL$ z@`}>@i}yU7i4^;@tLpqS978)RDC$K)N&BK4ZwsZ%V!tM!d2mqG@mKH_`^)Bej#-??ByQpTkeALP z?nH^VrIlkE=K}mdM7n`%I|QGL={jB9XrhhN(LiHK6OBjx=Ldjaj{l}`qKuf4aMCJ~ zU>n~f{R@S?OTp7dl=Mv1ecwoKt}2_wmqbzBAoOlzI63Uxud-8dyG;al{mW?EB>fNC WB8gY%H%J@+0000Gc~&HW?Ro3W zW}X!-U>Dd=YnRr5jd9@CnYTb2=mx+Sfmxsj4AR=&@4#o^G%y4X^fdG&(g92ZEuim# zw}E}#9ROt-aq=4wN?8j0(t9amr3bzX>;T((FB_4fClSK~;HUS!V4dmLz_) zCX8D%)|pok@L_f6e+;x$=qHk0>&yq>OdY(+>0u2Vv(D^!jB~&z74?#JW?lQUs=>$z z1|je~EAD!GJHRIJ9(bH*MUrQQwa)ZJ(|@>K0=GoHsetZ|Mo zqKrKA3X1rDP|vy7d@G|2_};%$Zhf{?lpaRL$bIX~%TWfZZk-Q+Z%MZ|;{H>~W?J+1 zMI?%DglWSu3789Ud<9rip*oTef!iWMN6(Ea!jN&@n@a-)veub5c~(3EX0-oNgRmNW zrD_ms$R){Bp?O{c%fMye0?-T wxz>Omz*peQBy&Hu&Z|x{a;EwjZTpA*0A4lAQ(t5q + + images/insert-text.png + images/barcode2.png + images/imageItem.png + images/shape2.png + images/shape4.png + images/insert-text_2.png + images/insert-text_3.png + images/hlayout.png + images/insert-text_5.png + images/shape5.png + images/imageItem1.png + images/imageItem2.png + images/settings.png + images/settings2.png + images/hlayuot_3_24.png + images/addBand1.png + images/DataBand.png + images/PageHeader.png + images/PageFooter.png + images/ReportHeader.png + images/ReportFooter.png + images/ReportPage.png + images/PageFooter16.png + images/PageHeader16.png + images/ReportFooter16.png + images/ReportHeader16.png + images/SubDetailBand16.png + images/SubDetailFooterBand16.png + images/SubDetailHeaderBand16.png + images/DataBand16.png + images/GroupFooter16.png + images/GroupHeader16.png + images/ReportPage16.png + + diff --git a/src/items/lralignpropitem.cpp b/src/items/lralignpropitem.cpp new file mode 100644 index 0000000..b859d1d --- /dev/null +++ b/src/items/lralignpropitem.cpp @@ -0,0 +1,165 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lralignpropitem.h" +#include "objectinspector/propertyItems/lrenumpropitem.h" +#include "objectinspector/editors/lrcomboboxeditor.h" +#include "lrtextitem.h" + +namespace{ + LimeReport::ObjectPropItem * createAlignItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly + ){ + return new LimeReport::AlignmentPropItem(object, objects, name, displayName, data, parent, readonly); + } + + bool registred = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("alignment","LimeReport::TextItem"), + QObject::tr("alignment"), + createAlignItem + ); +} + +namespace LimeReport{ + +QString AlignmentPropItem::associateValue(int value, const AlignMap* map) const +{ + QString result; + QMap::const_iterator it = map->constBegin(); + for(;it!= map->constEnd();++it){ + if ((value & it.value())) { + if (result.isEmpty()) result+=it.key(); + else result=result+" | "+it.key(); + } + } + return result; +} + +AlignmentPropItem::AlignmentPropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem *parent, bool readonly) + :ObjectPropItem(object, objects, name,displayName,value,parent,readonly) +{ + + m_horizMap.insert(tr("Left"),Qt::AlignLeft); + m_horizMap.insert(tr("Right"),Qt::AlignRight); + m_horizMap.insert(tr("Center"),Qt::AlignHCenter); + m_horizMap.insert(tr("Justify"),Qt::AlignJustify); + + m_vertMap.insert(tr("Top"),Qt::AlignTop); + m_vertMap.insert(tr("Center"),Qt::AlignVCenter); + m_vertMap.insert(tr("Botom"),Qt::AlignBottom); + + m_horizEditor = new AlignmentItemEditor(object, objects, name,tr("horizontal"),value.toInt(),this,false,m_horizMap); + m_vertEditor = new AlignmentItemEditor(object, objects, name,tr("vertical"), value.toInt(),this,false,m_vertMap); + + this->appendItem(m_horizEditor); + this->appendItem(m_vertEditor); +} + +QString AlignmentPropItem::displayValue() const +{ + return associateValue(propertyValue().toInt(),&m_horizMap)+" | "+ + associateValue(propertyValue().toInt(),&m_vertMap); +} + +void AlignmentPropItem::setPropertyValue(QVariant value) +{ + m_horizEditor->setPropertyValue(value); + m_vertEditor->setPropertyValue(value); + ObjectPropItem::setPropertyValue(value); +} + +AlignmentItemEditor::AlignmentItemEditor(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, + bool readonly, AlignMap acceptableValues) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly),m_acceptableValues(acceptableValues) +{ + if (! extractAcceptableValue(value.toInt()).isEmpty()) + setPropertyValue(extractAcceptableValue(value.toInt())[0]); + else setPropertyValue(0); +} + +void AlignmentItemEditor::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + int flags = object()->property(propertyName().toLatin1()).toInt(); + int align = m_acceptableValues.value(qobject_cast(propertyEditor)->text()); + flags=clearAcceptableValues(flags) | align; + object()->setProperty(propertyName().toLatin1(),flags); + foreach(QObject* item,*objects()){item->setProperty(propertyName().toLatin1(),flags);} + parent()->setPropertyValue(flags); + model->setData(index,align); +} + +QVector AlignmentItemEditor::extractAcceptableValue(int flags) +{ + QVector result; + AlignMap::const_iterator it = m_acceptableValues.constBegin(); + for (;it != m_acceptableValues.constEnd();++it) + { + if (flags & it.value()) result<addItems(enumValues); + return editor; +} + +void AlignmentItemEditor::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + ComboBoxEditor *editor=qobject_cast(propertyEditor); + editor->setTextValue(m_acceptableValues.key(Qt::Alignment(propertyValue().toInt()))); +} + +QString AlignmentItemEditor::displayValue() const +{ + return m_acceptableValues.key(Qt::Alignment(propertyValue().toInt())); +} + +void AlignmentItemEditor::setPropertyValue(QVariant value) +{ + ObjectPropItem::setPropertyValue(extractAcceptableValue(value.toInt())[0]); +} + +} diff --git a/src/items/lralignpropitem.h b/src/items/lralignpropitem.h new file mode 100644 index 0000000..36a0bd7 --- /dev/null +++ b/src/items/lralignpropitem.h @@ -0,0 +1,80 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRALIGNPROPITEM_H +#define LRALIGNPROPITEM_H + +#include "lrobjectpropitem.h" +#include "objectinspector/propertyItems/lrenumpropitem.h" + +namespace LimeReport{ + +typedef QMap AlignMap; + +class AlignmentItemEditor; + +class AlignmentPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + AlignmentPropItem():ObjectPropItem(){} + AlignmentPropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly=true); + QString displayValue() const; + void setPropertyValue(QVariant value); +private: + AlignMap m_vertMap; + AlignMap m_horizMap; + AlignmentItemEditor* m_horizEditor; + AlignmentItemEditor* m_vertEditor; + QString associateValue(int value, const AlignMap *map) const; +}; + +class AlignmentItemEditor : public ObjectPropItem +{ + Q_OBJECT +public: + AlignmentItemEditor():ObjectPropItem(){} + AlignmentItemEditor(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly, + AlignMap acceptableValues); + void setModelData(QWidget * propertyEditor, QAbstractItemModel * model, const QModelIndex & index); + void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex &) const; + QWidget* createProperyEditor(QWidget *parent) const; + QString displayValue() const; + void setPropertyValue(QVariant value); +protected: + QVector extractAcceptableValue(int flags); + int clearAcceptableValues(int flags); + AlignMap acceptableValues() const {return m_acceptableValues;} +private: + AlignMap m_acceptableValues; +}; + + +} +#endif // LRALIGNPROPITEM_H diff --git a/src/items/lrbarcodeitem.cpp b/src/items/lrbarcodeitem.cpp new file mode 100644 index 0000000..5647c21 --- /dev/null +++ b/src/items/lrbarcodeitem.cpp @@ -0,0 +1,248 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrbarcodeitem.h" +#include "lrdesignelementsfactory.h" +#include "qzint.h" +#include "lrglobal.h" + +namespace{ + +const QString xmlTag = "BarcodeItem"; + +LimeReport::BaseDesignIntf * createBarcodeItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::BarcodeItem(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator(xmlTag, LimeReport::ItemAttribs(QObject::tr("Barcode Item"),"Item"), createBarcodeItem); + +} + +namespace LimeReport{ + +BarcodeItem::BarcodeItem(QObject* owner,QGraphicsItem* parent) + : ContentItemDesignIntf(xmlTag,owner,parent),m_designTestValue("1"), m_barcodeType(CODE128), + m_foregroundColor(Qt::black), m_backgroundColor(Qt::white), m_whitespace(10), m_angle(Angle0), + m_barcodeWidth(0), m_securityLevel(0), m_pdf417CodeWords(928) +{} + +BarcodeItem::~BarcodeItem() +{} + +BaseDesignIntf *BarcodeItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new BarcodeItem(owner,parent); +} + +void BarcodeItem::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + ppainter->save(); + Zint::QZint bc; + if (itemMode() & DesignMode) bc.setText(m_designTestValue); + else bc.setText(m_content); + bc.setSymbol(m_barcodeType); + bc.setWhitespace(m_whitespace); + bc.setFgColor(m_foregroundColor); + bc.setBgColor(m_backgroundColor); + bc.setWidth(m_barcodeWidth); + bc.setSecurityLevel(m_securityLevel); + bc.setPdf417CodeWords(m_pdf417CodeWords); + + if (isSelected()) ppainter->setOpacity(SELECTION_OPACITY); + + QRectF bcRect; + + switch (m_angle) { + case Angle0: + bcRect = rect(); + break; + case Angle90: + ppainter->translate(width(),0); + ppainter->rotate(90); + bcRect = QRectF(0,0,height(),width()); + break; + case Angle180: + bcRect = rect(); + ppainter->translate(width(),height()); + ppainter->rotate(180); + break; + case Angle270: + ppainter->translate(0,height()); + ppainter->rotate(270); + bcRect = QRectF(0,0,height(),width()); + break; + } + + bc.render(*ppainter,bcRect,Zint::QZint::KeepAspectRatio); + ppainter->restore(); + ItemDesignIntf::paint(ppainter,option,widget); +} + +void BarcodeItem::setContent(const QString &content) +{ + if (m_content!=content){ + QString oldValue = m_content; + m_content=content; + update(); + notify("content",oldValue,m_content); + } +} + +void BarcodeItem::setBarcodeType(BarcodeItem::BarcodeType value) +{ + if (m_barcodeType!=value){ + BarcodeType oldValue = m_barcodeType; + m_barcodeType = value; + update(); + notify("barcodeType",oldValue,value); + } +} + +void BarcodeItem::setDesignTestValue(QString value) +{ + if (m_designTestValue!=value){ + QString oldValue = m_designTestValue; + m_designTestValue=value; + update(); + notify("testValue",oldValue,value); + } +} + +void BarcodeItem::setForegroundColor(QColor value) +{ + if (m_foregroundColor != value){ + QColor oldValue = m_foregroundColor; + m_foregroundColor=value; + update(); + notify("foregroundColor",oldValue,value); + } +} + +void BarcodeItem::setBackgroundColor(QColor value) +{ + if (m_backgroundColor != value){ + QColor oldValue = m_backgroundColor; + m_backgroundColor=value; + update(); + notify("backgroundColor",oldValue,value); + } +} + +void BarcodeItem::setWhitespace(int value) +{ + if (m_whitespace != value){ + int oldValue = m_whitespace; + m_whitespace = value; + update(); + notify("whitespace",oldValue,value); + } +} + +BarcodeItem::AngleType BarcodeItem::angle() const +{ + return m_angle; +} + +void BarcodeItem::setAngle(const AngleType &angle) +{ + if (m_angle!=angle){ + AngleType oldValue = m_angle; + m_angle = angle; + if (!isLoading()){ + update(); + notify("angle",oldValue,angle); + } + } +} + +int BarcodeItem::barcodeWidth() const +{ + return m_barcodeWidth; +} + +void BarcodeItem::setBarcodeWidth(int barcodeWidth) +{ + if (m_barcodeWidth != barcodeWidth){ + int oldValue = m_barcodeWidth; + m_barcodeWidth = barcodeWidth; + if (!isLoading()){ + update(); + notify("barcodeWidth",oldValue,m_barcodeWidth); + } + } +} + +int BarcodeItem::securityLevel() const +{ + return m_securityLevel; +} + +void BarcodeItem::setSecurityLevel(int securityLevel) +{ + if (m_securityLevel != securityLevel){ + int oldValue = m_securityLevel; + m_securityLevel = securityLevel; + if (!isLoading()){ + update(); + notify("securityLevel",oldValue,m_securityLevel); + } + } +} + +int BarcodeItem::pdf417CodeWords() const +{ + return m_pdf417CodeWords; +} + +void BarcodeItem::setPdf417CodeWords(int pdf417CodeWords) +{ + if (m_pdf417CodeWords != pdf417CodeWords){ + int oldValue = m_pdf417CodeWords; + m_pdf417CodeWords = pdf417CodeWords; + if (!isLoading()){ + update(); + notify("pdf417CodeWords",oldValue,m_pdf417CodeWords); + } + } +} + +void BarcodeItem::updateItemSize(RenderPass pass, int) +{ + switch(pass){ + case FirstPass: + setContent(expandUserVariables(content(),pass,NoEscapeSymbols)); + setContent(expandDataFields(content(),NoEscapeSymbols)); + break; + default:; + } +} + +bool BarcodeItem::isNeedUpdateSize(RenderPass pass) const +{return (pass==FirstPass)?true:false;} + +} diff --git a/src/items/lrbarcodeitem.h b/src/items/lrbarcodeitem.h new file mode 100644 index 0000000..001aec0 --- /dev/null +++ b/src/items/lrbarcodeitem.h @@ -0,0 +1,173 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRBARCODEITEM_H +#define LRBARCODEITEM_H +#include "lritemdesignintf.h" +#include + +namespace LimeReport{ + +class BarcodeItem : public LimeReport::ContentItemDesignIntf { + Q_OBJECT + Q_ENUMS(BarcodeType) + Q_ENUMS(AngleType) + Q_PROPERTY(QString content READ content WRITE setContent) + Q_PROPERTY(BarcodeType barcodeType READ barcodeType WRITE setBarcodeType ) + Q_PROPERTY(QString testValue READ designTestValue WRITE setDesignTestValue) + Q_PROPERTY(QColor foregroundColor READ foregroundColor WRITE setForegroundColor) + Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) + Q_PROPERTY(int whitespace READ whitespace WRITE setWhitespace) + Q_PROPERTY(AngleType angle READ angle WRITE setAngle) + Q_PROPERTY(int barcodeWidth READ barcodeWidth WRITE setBarcodeWidth) + Q_PROPERTY(int securityLevel READ securityLevel WRITE setSecurityLevel) + Q_PROPERTY(int pdf417CodeWords READ pdf417CodeWords WRITE setPdf417CodeWords) +public: +// enum BarcodeType {QRCODE=58,CODE128=20,DATAMATRIX=71,MAXICODE=57,MICROPDF417=84}; +// enum BarcodeType {CODE_11=1,C25MATRIX=2,QRCODE=58,CODE128=20,DATAMATRIX=71,MAXICODE=57,MICROPDF417=84, +// EAN=13,PDF417=55, TELEPEN_NUM=87,ITF14=89, KIX=90, MICROQR=97, +// EAN14=72,CHANNEL=140,CODEONE=141,GRIDMATRIX=142}; + enum BarcodeType { + CODE11 =1, + C25MATRIX =2, + C25INTER =3, + C25IATA =4, + C25LOGIC =6, + C25IND =7, + CODE39 =8, + EXCODE39 =9, + EANX =13, + EAN128 =16, + CODABAR =18, + CODE128 =20, + DPLEIT =21, + DPIDENT =22, + CODE16K =23, + CODE93 =25, + FLAT =28, + RSS14 =29, + RSS_LTD =30, + RSS_EXP =31, + TELEPEN =32, + UPCA =34, + UPCE =37, + POSTNET =40, + MSI_PLESSEY =47, + FIM =49, + LOGMARS =50, + PHARMA =51, + PZN =52, + PHARMA_TWO =53, + PDF417 =55, + PDF417TRUNC =56, + MAXICODE =57, + QRCODE =58, + CODE128B =60, + AUSPOST =63, + AUSREPLY =66, + AUSROUTE =67, + AUSREDIRECT =68, + ISBNX =69, + RM4SCC =70, + DATAMATRIX =71, + ITF14 =72, + CODABLOCKF =74, + NVE18 =75, + KOREAPOST =77, + RSS14STACK =79, + RSS14STACK_OMNI =80, + RSS_EXPSTACK =81, + PLANET =82, + MICROPDF417 =84, + ONECODE =85, + PLESSEY =86, + KIX =90, + AZTEC =92, + DAFT =93, + ITALYPOST =94, + DPD =96, + MICROQR =97, + TELEPEN_NUM =128, + CODE32 =129, + EANX_CC =130, + EAN128_CC =131, + RSS14_CC =132, + RSS_LTD_CC =133, + RSS_EXP_CC =134, + UPCA_CC =135, + UPCE_CC =136, + RSS14STACK_CC =137, + RSS14_OMNI_CC =138, + RSS_EXPSTACK_CC =139 + + }; + enum AngleType{Angle0,Angle90,Angle180,Angle270}; + BarcodeItem(QObject *owner, QGraphicsItem *parent); + ~BarcodeItem(); + virtual BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent); + virtual void paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget); + virtual void updateItemSize(RenderPass pass, int); + virtual bool isNeedUpdateSize(RenderPass pass) const; + void setContent(const QString& content); + QString content() const {return m_content;} + void setBarcodeType(BarcodeType value); + BarcodeType barcodeType(){return m_barcodeType;} + void setDesignTestValue(QString value); + QString designTestValue(){return m_designTestValue;} + QColor foregroundColor(){return m_foregroundColor;} + void setForegroundColor(QColor value); + QColor backgroundColor(){return m_backgroundColor;} + void setBackgroundColor(QColor value); + int whitespace(){return m_whitespace;} + void setWhitespace(int value); + AngleType angle() const; + void setAngle(const AngleType &angle); + int barcodeWidth() const; + void setBarcodeWidth(int barcodeWidth); + int securityLevel() const; + void setSecurityLevel(int securityLevel); + int pdf417CodeWords() const; + void setPdf417CodeWords(int pdf417CodeWords); + +private: + Zint::QZint m_bc; + QString m_content; + QString m_designTestValue; + BarcodeType m_barcodeType; + QColor m_foregroundColor; + QColor m_backgroundColor; + int m_whitespace; + AngleType m_angle; + int m_barcodeWidth; + int m_securityLevel; + int m_pdf417CodeWords; +}; + +} +#endif // LRBARCODEITEM_H diff --git a/src/items/lrhorizontallayout.cpp b/src/items/lrhorizontallayout.cpp new file mode 100644 index 0000000..340b10b --- /dev/null +++ b/src/items/lrhorizontallayout.cpp @@ -0,0 +1,432 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrhorizontallayout.h" +#include "lrdesignelementsfactory.h" + +#include +#include +#include +#include + +#include "lrbasedesignintf.h" + +const QString xmlTag = "HLayout"; + +namespace { + +LimeReport::BaseDesignIntf *createHLayout(QObject *owner, LimeReport::BaseDesignIntf *parent) +{ + return new LimeReport::HorizontalLayout(owner, parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, + LimeReport::ItemAttribs(QObject::tr("HLayout"), LimeReport::bandTAG), + createHLayout + ); +} + + +namespace LimeReport { + +bool lessThen(BaseDesignIntf *c1, BaseDesignIntf* c2){ + return c1->pos().x()pos().x(); +} + + +HorizontalLayout::HorizontalLayout(QObject *owner, QGraphicsItem *parent) + : LayoutDesignIntf(xmlTag, owner, parent),m_isRelocating(false) +{ + setPosibleResizeDirectionFlags(ResizeBottom); + m_layoutMarker = new LayoutMarker(this); + m_layoutMarker->setParentItem(this); + m_layoutMarker->setColor(Qt::red); + m_layoutMarker->setHeight(height()); + m_layoutMarker->setZValue(1); +} + +HorizontalLayout::~HorizontalLayout() +{ + if (m_layoutMarker) { + delete m_layoutMarker; m_layoutMarker=0; + } +} + +BaseDesignIntf *HorizontalLayout::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new LimeReport::HorizontalLayout(owner, parent); +} + +void HorizontalLayout::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + Q_UNUSED(event) +// if ((itemMode() & LayoutEditMode) || isSelected()){ +// setChildVisibility(false); +// } +} + +void HorizontalLayout::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + Q_UNUSED(event) +// setChildVisibility(true); +} + +void HorizontalLayout::geometryChangedEvent(QRectF newRect, QRectF ) +{ + m_layoutMarker->setHeight(newRect.height()); + relocateChildren(); +} + +void HorizontalLayout::setChildVisibility(bool value){ + foreach(QGraphicsItem* child,childItems()){ + BaseDesignIntf* item = dynamic_cast(child); + if(item) + item->setVisible(value); + } +} + +int HorizontalLayout::childrenCount() +{ + return m_children.size(); +} + +void HorizontalLayout::initMode(BaseDesignIntf::ItemMode mode) +{ + BaseDesignIntf::initMode(mode); + if ((mode==PreviewMode)||(mode==PrintMode)){ + m_layoutMarker->setVisible(false); + } else { + m_layoutMarker->setVisible(true); + } +} + +bool HorizontalLayout::canBeSplitted(int height) const +{ + foreach(QGraphicsItem* qgItem,childItems()){ + BaseDesignIntf* item=dynamic_cast(qgItem); + if (item) + if (!item->canBeSplitted(height-item->pos().y())) return false; + } + return true; +} + +BaseDesignIntf *HorizontalLayout::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent) +{ + HorizontalLayout* upperPart = dynamic_cast(createSameTypeItem(owner,parent)); + upperPart->initFromItem(this); + qreal maxHeight = 0; + foreach(BaseDesignIntf* item,childBaseItems()){ + + if ((item->geometry().top()geometry().bottom()>height)){ + int sliceHeight = height-item->geometry().top(); + if (item->canBeSplitted(sliceHeight)){ + BaseDesignIntf* slicedPart = item->cloneUpperPart(sliceHeight,upperPart,upperPart); + if (maxHeightheight()) maxHeight = slicedPart->height(); + } else { + item->cloneEmpty(sliceHeight,upperPart,upperPart); + item->setPos(item->pos().x(),item->pos().y()+((height+1)-item->geometry().top())); + } + } + } + + foreach(BaseDesignIntf* item, upperPart->childBaseItems()){ + item->setHeight((maxHeightsetHeight(height); + + return upperPart; +} + +BaseDesignIntf *HorizontalLayout::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) +{ + qreal maxHeight = 0; + HorizontalLayout* bottomPart = dynamic_cast(createSameTypeItem(owner,parent)); + bottomPart->initFromItem(this); + foreach(BaseDesignIntf* item,childBaseItems()){ + if ((item->geometry().top()geometry().bottom()>height)){ + BaseDesignIntf* tmpItem=item->cloneBottomPart(height,bottomPart,bottomPart); + tmpItem->setPos(tmpItem->pos().x(),0); + if (maxHeightheight()) + maxHeight = tmpItem->height(); + } + } + + if (!bottomPart->isEmpty()){ + foreach (BaseDesignIntf* item, bottomPart->childBaseItems()) { + item->setHeight(maxHeight); + } + bottomPart->setHeight(maxHeight); + } + return bottomPart; +} + +void HorizontalLayout::restoreChild(BaseDesignIntf* item){ + if (m_children.contains(item)) return; + + m_isRelocating=true; + foreach (BaseDesignIntf* child, childBaseItems()) { + if (child->pos()==item->pos()){ + int index = m_children.indexOf(child)-1; + m_children.insert(index,item); + child->setPos(item->pos().x()+item->width(),0); + break; + } + } + + connect(item,SIGNAL(destroyed(QObject*)),this,SLOT(slotOnChildDestroy(QObject*))); + connect(item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)),this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF))); + item->setFixedPos(true); + item->setPosibleResizeDirectionFlags(ResizeRight | ResizeBottom); + item->setParent(this); + item->setParentItem(this); + + updateLayoutSize(); + m_isRelocating=false; +} + +bool HorizontalLayout::isEmpty() const +{ + bool isEmpty = true; + bool allItemsIsText = true; + foreach (QGraphicsItem* qgItem, childItems()) { + ContentItemDesignIntf* item = dynamic_cast(qgItem); + if (item && !item->content().isEmpty()) isEmpty = false; + if (!item && dynamic_cast(qgItem)) + allItemsIsText = false; + } + return (isEmpty && allItemsIsText); +} + +void HorizontalLayout::addChild(BaseDesignIntf *item, bool updateSize) +{ + if (m_children.count() > 0) + item->setPos(m_children.last()->pos().x() + m_children.last()->width(), 0); + else + item->setPos(0, 0); + + m_children.append(item); + item->setParentItem(this); + item->setParent(this); + item->setFixedPos(true); + item->setPosibleResizeDirectionFlags(ResizeRight | ResizeBottom); + + connect(item,SIGNAL(destroyed(QObject*)),this,SLOT(slotOnChildDestroy(QObject*))); + connect(item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)),this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF))); + + if (updateSize){ + relocateChildren(); + updateLayoutSize(); + } +} + +void HorizontalLayout::collectionLoadFinished(const QString &collectionName) +{ + ItemDesignIntf::collectionLoadFinished(collectionName); + if (collectionName.compare("children",Qt::CaseInsensitive)==0){ +#ifdef HAVE_QT5 + foreach(QObject* obj,children()){ +#else + foreach(QObject* obj,QObject::children()){ +#endif + BaseDesignIntf* item = dynamic_cast(obj); + if (item) { + addChild(item,false); + } + } + } +} + +void HorizontalLayout::objectLoadFinished() +{ + m_layoutMarker->setHeight(height()); + LayoutDesignIntf::objectLoadFinished(); +} + +void HorizontalLayout::updateLayoutSize() +{ + int w = 0; + qreal h = 0; + foreach(BaseDesignIntf* item, m_children){ + if (hheight()) h=item->height(); + w+=item->width(); + } + if (h>0) setHeight(h); + setWidth(w); +} + +void HorizontalLayout::relocateChildren() +{ + if (m_children.count()setPos(curX,0); + curX+=item->width(); + item->setHeight(height()); + } + m_isRelocating = false; +} + +void HorizontalLayout::beforeDelete() +{ + m_children.clear(); +#ifdef HAVE_QT5 + foreach (QObject *item, children()) { +#else + foreach (QObject *item, QObject::children()) { +#endif + BaseDesignIntf *bdItem = dynamic_cast(item); + if (bdItem) { + bdItem->setParentItem(parentItem()); + bdItem->setParent(parent()); + bdItem->setVisible(true); + bdItem->setPos(mapToParent(bdItem->pos())); + bdItem->setFixedPos(false); + bdItem->setPosibleResizeDirectionFlags(AllDirections); + } + } +} + +void HorizontalLayout::updateItemSize(RenderPass pass, int maxHeight) +{ + m_isRelocating=true; + ItemDesignIntf::updateItemSize(pass,maxHeight); + foreach(QGraphicsItem *child, childItems()){ + BaseDesignIntf* item = dynamic_cast(child); + if (item) item->updateItemSize(pass,maxHeight); + } + updateLayoutSize(); + relocateChildren(); + m_isRelocating=false; +} + +bool HorizontalLayout::isNeedUpdateSize(RenderPass pass) const +{ + foreach (QGraphicsItem *child, childItems()) { + BaseDesignIntf* item = dynamic_cast(child); + if (item && item->isNeedUpdateSize(pass)) + return true; + } + return false; +} + +void HorizontalLayout::childAddedEvent(BaseDesignIntf *child) +{ + addChild(child,false); +} + +void HorizontalLayout::slotOnChildDestroy(QObject* child) +{ + m_children.removeAll(static_cast(child)); + if (m_children.count()<2){ + beforeDelete(); +// deleteLater(); + } else { + relocateChildren(); + updateLayoutSize(); + } +} + +void HorizontalLayout::slotOnChildGeometryChanged(QObject *, QRectF newGeometry, QRectF) +{ + if (!m_isRelocating){ + setHeight(newGeometry.height()); + relocateChildren(); + updateLayoutSize(); + } +} + +LayoutMarker::LayoutMarker(HorizontalLayout *layout, QGraphicsItem *parent) + :QGraphicsItem(parent), m_rect(0,0,30,30), m_color(Qt::red), m_layout(layout){ + setFlag(QGraphicsItem::ItemIsMovable); +} + +void LayoutMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + painter->save(); + painter->setOpacity(LAYOUT_MARKER_OPACITY); + painter->fillRect(boundingRect(),m_color); + + painter->setRenderHint(QPainter::Antialiasing); + qreal size = (boundingRect().width()isSelected()){ + painter->setOpacity(1); + QRectF r = QRectF(0,0,size,size); + painter->setBrush(Qt::white); + painter->setPen(Qt::white); + painter->drawEllipse(r.adjusted(5,5,-5,-5)); + painter->setBrush(m_color); + painter->drawEllipse(r.adjusted(7,7,-7,-7)); + } + painter->restore(); +} + +void LayoutMarker::setHeight(qreal height) +{ + if (m_rect.height()!=height){ + prepareGeometryChange(); + m_rect.setHeight(height); + } +} + +void LayoutMarker::setWidth(qreal width) +{ + if (m_rect.width()!=width){ + prepareGeometryChange(); + m_rect.setWidth(width); + } +} + +void LayoutMarker::setColor(QColor color) +{ + if (m_color!=color){ + m_color = color; + update(boundingRect()); + } +} + +void LayoutMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->button()==Qt::LeftButton) { + if (!(event->modifiers() & Qt::ControlModifier)) + m_layout->scene()->clearSelection(); + m_layout->setSelected(true); + //m_layout->setChildVisibility(false); + update(0,0,boundingRect().width(),boundingRect().width()); + } +} + +} // namespace LimeReport diff --git a/src/items/lrhorizontallayout.h b/src/items/lrhorizontallayout.h new file mode 100644 index 0000000..5e480be --- /dev/null +++ b/src/items/lrhorizontallayout.h @@ -0,0 +1,101 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRHORIZONTALLAYOUT_H +#define LRHORIZONTALLAYOUT_H +#include "lritemdesignintf.h" + +namespace LimeReport +{ + +class HorizontalLayout; + +class LayoutMarker : public QGraphicsItem{ +public: + explicit LayoutMarker(HorizontalLayout* layout, QGraphicsItem *parent=0); + virtual QRectF boundingRect() const{return m_rect;} + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + void setHeight(qreal height); + void setWidth(qreal width); + void setColor(QColor color); + qreal width(){return m_rect.width();} + qreal height(){return m_rect.height();} +protected: + void mousePressEvent(QGraphicsSceneMouseEvent *event); +private: + QRectF m_rect; + QColor m_color; + HorizontalLayout* m_layout; +}; + +class HorizontalLayout : public LayoutDesignIntf +{ + Q_OBJECT +public: + HorizontalLayout(QObject *owner = 0, QGraphicsItem *parent = 0); + ~HorizontalLayout(); + BaseDesignIntf *createSameTypeItem(QObject *owner = 0, QGraphicsItem *parent = 0); + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + void geometryChangedEvent(QRectF newRect, QRectF); + void addChild(BaseDesignIntf *item,bool updateSize=true); + friend class BaseDesignIntf; + void restoreChild(BaseDesignIntf *item); + bool isEmpty() const; +protected: + void collectionLoadFinished(const QString &collectionName); + void objectLoadFinished(); + void updateLayoutSize(); + void relocateChildren(); + void beforeDelete(); + void updateItemSize(RenderPass pass, int maxHeight); + bool isNeedUpdateSize(RenderPass pass) const; + void childAddedEvent(BaseDesignIntf *child); + void setChildVisibility(bool value); + int childrenCount(); + void initMode(ItemMode mode); + + bool canBeSplitted(int height) const; + BaseDesignIntf* cloneUpperPart(int height, QObject* owner=0, QGraphicsItem* parent=0); + BaseDesignIntf* cloneBottomPart(int height, QObject *owner=0, QGraphicsItem *parent=0); + +private slots: + void slotOnChildDestroy(QObject *child); + void slotOnChildGeometryChanged(QObject*, QRectF newGeometry, QRectF); + //void slotOnPosChanged(QObject*, QPointF newPos, QPointF ); +private: + QList m_children; + bool m_isRelocating; + LayoutMarker* m_layoutMarker; + + friend class LayoutMarker; +}; + +} //namespace LimeReport +#endif // LRHORIZONTALLAYOUT_H diff --git a/src/items/lrimageitem.cpp b/src/items/lrimageitem.cpp new file mode 100644 index 0000000..c573167 --- /dev/null +++ b/src/items/lrimageitem.cpp @@ -0,0 +1,261 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrimageitem.h" +#include "lrdesignelementsfactory.h" +#include "lrglobal.h" +#include "lrdatasourcemanager.h" + +namespace{ + +const QString xmlTag = "ImageItem"; + +LimeReport::BaseDesignIntf * createImageItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::ImageItem(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, LimeReport::ItemAttribs(QObject::tr("Image Item"),"Item"), createImageItem + ); +} + +namespace LimeReport{ + +ImageItem::ImageItem(QObject* owner,QGraphicsItem* parent) + :ItemDesignIntf(xmlTag,owner,parent),m_autoSize(false), m_scale(true), m_keepAspectRatio(true), m_center(true){} + +BaseDesignIntf *ImageItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new ImageItem(owner,parent); +} + +void ImageItem::updateItemSize(RenderPass , int ) +{ + if (!m_datasource.isEmpty() && !m_field.isEmpty() && m_picture.isNull()){ + DataSourceManager* dm = DataSourceManager::instance(); + IDataSource* ds = dm->dataSource(m_datasource); + if (ds) { + QVariant data = ds->data(m_field); + if (data.isValid()){ + if (data.type()==QVariant::Image){ + m_picture = data.value(); + } else + m_picture.loadFromData(data.toByteArray()); + } + } + } + if (m_autoSize){ + setWidth(m_picture.width()); + setHeight(m_picture.height()); + } +} + +bool ImageItem::isNeedUpdateSize(RenderPass) const +{ + return m_picture.isNull() || m_autoSize; +} + +qreal ImageItem::minHeight() const{ + if (!m_picture.isNull() && autoSize()) + { + return m_picture.height(); + } else { + return 0; + } +} + +bool ImageItem::center() const +{ + return m_center; +} + +void ImageItem::setCenter(bool center) +{ + if (m_center != center){ + m_center = center; + update(); + notify("center",!center,center); + } +} + +bool ImageItem::keepAspectRatio() const +{ + return m_keepAspectRatio; +} + +void ImageItem::setKeepAspectRatio(bool keepAspectRatio) +{ + if (m_keepAspectRatio != keepAspectRatio){ + m_keepAspectRatio = keepAspectRatio; + update(); + notify("keepAspectRatio",!keepAspectRatio,keepAspectRatio); + } +} + +bool ImageItem::scale() const +{ + return m_scale; +} + +void ImageItem::setScale(bool scale) +{ + if (m_scale != scale){ + m_scale = scale; + update(); + notify("scale",!scale,scale); + } +} +bool ImageItem::autoSize() const +{ + return m_autoSize; +} + +void ImageItem::setAutoSize(bool autoSize) +{ + if (m_autoSize != autoSize){ + m_autoSize = autoSize; + if (m_autoSize && !m_picture.isNull()){ + setWidth(image().width()); + setHeight(image().height()); + setPosibleResizeDirectionFlags(Fixed); + } else { + setPosibleResizeDirectionFlags(AllDirections); + } + update(); + notify("autoSize",!autoSize,autoSize); + } +} + +QString ImageItem::field() const +{ + return m_field; +} + +void ImageItem::setField(const QString &field) +{ + if (m_field != field){ + QString oldValue = m_field; + m_field = field; + update(); + notify("field",oldValue,field); + } +} + +QString ImageItem::datasource() const +{ + return m_datasource; +} + +void ImageItem::setDatasource(const QString &datasource) +{ + if (m_datasource != datasource){ + QString oldValue = m_datasource; + m_datasource = datasource; + update(); + notify("datasource",oldValue,datasource); + } +} + + +void ImageItem::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + ppainter->save(); + if (isSelected()) ppainter->setOpacity(SELECTION_OPACITY); + else ppainter->setOpacity(qreal(opacity())/100); + + QPointF point = rect().topLeft(); + QImage img; + + if (m_scale && !image().isNull()){ + img = image().scaled(rect().width(), rect().height(), keepAspectRatio() ? Qt::KeepAspectRatio : Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + } else { + img = image(); + } + + qreal shiftHeight = rect().height() - img.height(); + qreal shiftWidth = rect().width() - img.width(); + + if (m_center){ + if (shiftHeight<0 || shiftWidth<0){ + qreal cutX = 0; + qreal cutY = 0; + qreal cutWidth = img.width(); + qreal cutHeigth = img.height(); + + if (shiftWidth > 0){ + point.setX(point.x()+shiftWidth/2); + } else { + cutX = abs(shiftWidth/2); + cutWidth += shiftWidth; + } + + if (shiftHeight > 0){ + point.setY(point.x()+shiftHeight/2); + } else { + cutY = abs(shiftHeight/2); + cutHeigth += shiftHeight; + } + + img = img.copy(cutX,cutY,cutWidth,cutHeigth); + } else { + point.setX(point.x()+shiftWidth/2); + point.setY(point.y()+shiftHeight/2); + } + } + + if (img.isNull() && itemMode()==DesignMode){ + QString text; + ppainter->setFont(transformToSceneFont(QFont("Arial",10))); + if (!datasource().isEmpty() && !field().isEmpty()) + text = datasource()+"."+field(); + else text = tr("Image"); + ppainter->drawText(rect().adjusted(4,4,-4,-4), Qt::AlignCenter, text ); + } else { + ppainter->drawImage(point,img); + } + ItemDesignIntf::paint(ppainter,option,widget); + ppainter->restore(); +} + +void ImageItem::setImage(QImage value) +{ + if (m_picture!=value){ + QImage oldValue = m_picture; + m_picture=value; + if (m_autoSize){ + setWidth(m_picture.width()); + setHeight(m_picture.height()); + } + update(); + notify("image",oldValue,value); + } +} + + + +} diff --git a/src/items/lrimageitem.h b/src/items/lrimageitem.h new file mode 100644 index 0000000..7a0f734 --- /dev/null +++ b/src/items/lrimageitem.h @@ -0,0 +1,85 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRIMAGEITEM_H +#define LRIMAGEITEM_H +#include "lritemdesignintf.h" + +namespace LimeReport{ + +class ImageItem : public LimeReport::ItemDesignIntf +{ + Q_OBJECT + Q_PROPERTY(QImage image READ image WRITE setImage) + Q_PROPERTY(int opacity READ opacity WRITE setOpacity) + Q_PROPERTY(QString datasource READ datasource WRITE setDatasource) + Q_PROPERTY(QString field READ field WRITE setField) + Q_PROPERTY(bool autoSize READ autoSize WRITE setAutoSize) + Q_PROPERTY(bool scale READ scale WRITE setScale) + Q_PROPERTY(bool keepAspectRatio READ keepAspectRatio WRITE setKeepAspectRatio) + Q_PROPERTY(bool center READ center WRITE setCenter) +public: + ImageItem(QObject *owner, QGraphicsItem *parent); + virtual void paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option, QWidget *widget); + void setImage(QImage value); + QImage image(){return m_picture;} + void setContent(const QString &value){m_content=value;} + QString datasource() const; + void setDatasource(const QString &datasource); + QString field() const; + void setField(const QString &field); + + bool autoSize() const; + void setAutoSize(bool autoSize); + bool scale() const; + void setScale(bool scale); + bool keepAspectRatio() const; + void setKeepAspectRatio(bool keepAspectRatio); + bool center() const; + void setCenter(bool center); + + qreal minHeight() const; + +protected: + BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent); + void updateItemSize(RenderPass, int); + bool isNeedUpdateSize(RenderPass) const; +private: + QImage m_picture; + QString m_content; + QString m_datasource; + QString m_field; + bool m_autoSize; + bool m_scale; + bool m_keepAspectRatio; + bool m_center; +}; + +} +#endif // LRIMAGEITEM_H diff --git a/src/items/lrshapeitem.cpp b/src/items/lrshapeitem.cpp new file mode 100644 index 0000000..390ded6 --- /dev/null +++ b/src/items/lrshapeitem.cpp @@ -0,0 +1,190 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrshapeitem.h" +#include "lrdesignelementsfactory.h" +#include +#include + +namespace{ + +const QString xmlTag = "ShapeItem"; + +LimeReport::BaseDesignIntf * createShapeItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::ShapeItem(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, LimeReport::ItemAttribs(QObject::tr("Shape Item"),"Item"), createShapeItem + ); +} + + +namespace LimeReport{ + +ShapeItem::ShapeItem(QObject *owner, QGraphicsItem *parent) + :ItemDesignIntf(xmlTag,owner,parent), + m_shape(HorizontalLine), + m_shapeColor(Qt::black), + m_shapeBrushColor(Qt::black), + m_shapeBrushType(Qt::NoBrush), + m_lineWidth(1), + m_penStyle(Qt::SolidLine), + m_opacity(100) +{ +} + +void ShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + painter->save(); + + QPen pen(m_shapeColor); + pen.setWidthF(m_lineWidth); + pen.setStyle(m_penStyle); + painter->setPen(pen); + QBrush brush(m_shapeBrushColor,m_shapeBrushType); + + painter->setBrush(brush); + painter->setBackground(QBrush(Qt::NoBrush)); + painter->setOpacity(qreal(m_opacity)/100); + + switch (m_shape){ + case HorizontalLine: + painter->drawLine(0,rect().height()/2,rect().right(),rect().height()/2); + break; + case VerticalLine: + painter->drawLine(rect().width()/2,0,rect().width()/2,rect().height()); + break; + case Ellipse: + painter->setRenderHint(QPainter::Antialiasing); + painter->drawEllipse(rect()); + break; + case Rectangle: + painter->setRenderHint(QPainter::Antialiasing); + painter->drawRect(rect()); + break; + } + painter->restore(); + ItemDesignIntf::paint(painter,option,widget); + +} + +void ShapeItem::setShapeColor(QColor value) +{ + if ((value!=m_shapeColor)){ + QColor oldValue = m_shapeColor; + m_shapeColor=value; + update(); + notify("shapeColor",oldValue,value); + } +} + +void ShapeItem::setShapeBrushColor(QColor value) +{ + if (value!=m_shapeBrushColor){ + QColor oldValue = m_shapeBrushColor; + m_shapeBrushColor=value; + update(); + notify("shapeBrushColor",oldValue,value); + } +} + +void ShapeItem::setShapeBrushType(Qt::BrushStyle value) +{ + if (m_shapeBrushType!=value){ + Qt::BrushStyle oldValue = m_shapeBrushType; + m_shapeBrushType=value; + update(rect()); + notify("shapeBrush",QBrush(oldValue),QBrush(value)); + } +} + +void ShapeItem::setShapeType(ShapeItem::ShapeType value) +{ + if (m_shape!=value){ + ShapeType oldValue = m_shape; + m_shape=value; + update(); + notify("shape",oldValue,value); + } +} + +void ShapeItem::setLineWidth(qreal value) +{ + if (m_lineWidth!=value){ + qreal oldValue = m_lineWidth; + m_lineWidth=value; + update(); + notify("lineWidth",oldValue,value); + + } +} + +Qt::PenStyle ShapeItem::penStyle() const +{ + return m_penStyle; +} + +void ShapeItem::setPenStyle(const Qt::PenStyle &value) +{ + if (m_penStyle!=value){ + Qt::PenStyle oldValue = m_penStyle; + m_penStyle = value; + update(); + notify("penStyle",(int)oldValue,(int)value); + } +} + +BaseDesignIntf *ShapeItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new ShapeItem(owner,parent); +} +int ShapeItem::opacity() const +{ + return m_opacity; +} + +void ShapeItem::setOpacity(int opacity) +{ + if (m_opacity!=opacity){ + if (opacity < 0) { + m_opacity = 0; + } + else if (opacity > 100) { + m_opacity = 100; + } + else { + m_opacity = opacity; + } + update(); + } +} + + + +} diff --git a/src/items/lrshapeitem.h b/src/items/lrshapeitem.h new file mode 100644 index 0000000..84cc6d9 --- /dev/null +++ b/src/items/lrshapeitem.h @@ -0,0 +1,79 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSHAPEITEM_H +#define LRSHAPEITEM_H +#include "lritemdesignintf.h" + +namespace LimeReport{ + +class ShapeItem: public LimeReport::ItemDesignIntf +{ + Q_OBJECT + Q_ENUMS(ShapeType) + Q_PROPERTY(ShapeType shape READ shapeType WRITE setShapeType) + Q_PROPERTY(QColor shapeColor READ shapeColor WRITE setShapeColor) + Q_PROPERTY(QColor shapeBrushColor READ shapeBrushColor WRITE setShapeBrushColor) + Q_PROPERTY(Qt::BrushStyle shapeBrush READ shapeBrushType WRITE setShapeBrushType) + Q_PROPERTY(qreal lineWidth READ lineWidth WRITE setLineWidth) + Q_PROPERTY(Qt::PenStyle penStyle READ penStyle WRITE setPenStyle) + Q_PROPERTY(int opacity READ opacity WRITE setOpacity) +public: + enum ShapeType{HorizontalLine,VerticalLine,Ellipse,Rectangle}; + ShapeItem(QObject *owner, QGraphicsItem *parent); + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + void setShapeColor(QColor value); + QColor shapeColor() const {return m_shapeColor;} + void setShapeBrushColor(QColor value); + QColor shapeBrushColor() const {return m_shapeBrushColor;} + void setShapeBrushType(Qt::BrushStyle value); + Qt::BrushStyle shapeBrushType() const {return m_shapeBrushType;} + void setShapeType(ShapeType value); + ShapeType shapeType() const {return m_shape;} + void setLineWidth(qreal value); + qreal lineWidth() const {return m_lineWidth;} + Qt::PenStyle penStyle() const; + void setPenStyle(const Qt::PenStyle &value); + int opacity() const; + void setOpacity(int opacity); + +protected: + virtual BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent); +private: + ShapeType m_shape; + QColor m_shapeColor; + QColor m_shapeBrushColor; + Qt::BrushStyle m_shapeBrushType; + qreal m_lineWidth; + Qt::PenStyle m_penStyle; + int m_opacity; +}; + +} +#endif // LRSHAPEITEM_H diff --git a/src/items/lrsimpletagparser.cpp b/src/items/lrsimpletagparser.cpp new file mode 100644 index 0000000..128cb8c --- /dev/null +++ b/src/items/lrsimpletagparser.cpp @@ -0,0 +1,238 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrsimpletagparser.h" +#include +#include +#include + +namespace LimeReport{ +void HtmlContext::fillTagVector(QString html) +{ + QRegExp rx("<[^<]*>"); + QString buff=html; + int curPos=0; + while(buff.contains(rx)){ + int pos=rx.indexIn(buff); + curPos+=pos; + buff=buff.right(buff.length()-pos); + if (rx.cap().at(1)!='/'){ + int initPos=curPos; + parseTag(m_tags,buff,initPos); + } + buff=buff.right(buff.length()-rx.matchedLength()); + } +} + +QString HtmlContext::parseTag(QVector &storage, QString text, int &curPos, bool createTag) +{ + QRegExp rx("<[^<]*>"); + int pos=rx.indexIn(text); + int begPos=pos+curPos; + QString buff=text.right(text.length()-(pos+rx.matchedLength())); + + QString tagName=rx.cap(0); + tagName.remove('<'); + tagName.remove('>'); + + while (buff.contains(rx)){ + int pos=rx.indexIn(buff); + buff=buff.right(buff.length()-pos); + curPos+=pos; + if (extractWord(rx.cap(0),1).compare(extractWord(tagName,1),Qt::CaseInsensitive)==0){ + if (rx.cap(0).at(1)=='/'){ + if (createTag) storage.append(new Tag(tagName,begPos,curPos)); + return buff.right(buff.length()-rx.matchedLength()); + } else { + buff=parseTag(storage,buff,curPos,false); + + } + } else { + buff=buff.right(buff.length()-rx.matchedLength()); + } + } + return ""; +} + +void HtmlContext::parseSymbs(QString text) +{ + + QRegExp rx("<[^<]*[^/]>"); + while (text.contains(rx)){ + int pos=rx.indexIn(text); + if (rx.cap().compare("
",Qt::CaseInsensitive)==0) + m_symbs.append(new Symb(rx.cap(),pos)); + text.remove(pos,rx.matchedLength()); + } + + foreach(QString pattern,m_symbPatterns){ + rx.setPattern(pattern); + while (text.contains(rx)){ + int pos=rx.indexIn(text); + m_symbs.append(new Symb(rx.cap(0),pos)); + text.replace(rx.cap(0)," "); + } + } +} + +void HtmlContext::initSymbPatterns() +{ + m_symbPatterns<<"&[^&]*;"<<"<[^<]*/>"; +} + +HtmlContext::HtmlContext(QString html) +{ + fillTagVector(html); + parseSymbs(html); + initSymbPatterns(); +} + +HtmlContext::~HtmlContext() +{ + clearTags(); + clearSymbs(); +} + +QString HtmlContext::extractWord(QString text, int index) +{ + text.remove('<'); + text.remove('>'); + text.remove('/'); + int counter=1; + QString retWord(""); + for (int i=0;i HtmlContext::tagVectDiff(QVector source, QVector dest) +{ + QVector resVect; + for(int i=0;i source, QVector dest) +{ + if (source.count()!=dest.count()) return false; + foreach(Tag* tag,source){ + if (!dest.contains(tag)) return false; + } + return true; +} + +QString HtmlContext::extendTextByTags(QString text, int pos) +{ + QString curText=""; + QVector curTags=tagsAt(pos); + for(int i=0;itagText()+'>'; + } + + for(int i=0;i tagsAtPos=tagsAt(pos); + if (!HtmlContext::isVectorEqual(curTags,tagsAtPos)){ + QVector diffs=HtmlContext::tagVectDiff(curTags,tagsAtPos); + foreach(TagDiff diff,diffs){ + if (diff.direction==TagDiff::Inner){ + curText+='<'+diff.tag->tagText()+'>'; + curTags.append(diff.tag); + } + else{ + curText+="tagText(),1)+'>'; + curTags.remove(curTags.indexOf(diff.tag)); + } + } + } + Symb s=symbAt(pos); + if (s.isValid()){ + if (s.isTag()) curText+=s.text()+text.at(i); + else curText+=s.text(); + } else curText+=text.at(i); + } + + curTags=tagsAt(pos); + for(int i=0;itagText(),1)+'>'; + } + + return curText; +} + +QVector HtmlContext::tagsAt(int pos) +{ + QVector result; + foreach(Tag* tag,m_tags){ + if ((pos>=tag->begin())&&(pos<=tag->end())) result.append(tag); + } + return result; +} + +Symb HtmlContext::symbAt(int pos) +{ + foreach(Symb* symb,m_symbs){ + if (pos==symb->pos()) return *symb; + } + return Symb(); +} + +void HtmlContext::clearTags() +{ + foreach(Tag* tag,m_tags) delete tag; + m_tags.clear(); +} + +void HtmlContext::clearSymbs() +{ + foreach(Symb* symb,m_symbs) delete symb; + m_tags.clear(); +} + +} diff --git a/src/items/lrsimpletagparser.h b/src/items/lrsimpletagparser.h new file mode 100644 index 0000000..6463edc --- /dev/null +++ b/src/items/lrsimpletagparser.h @@ -0,0 +1,100 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSIMPLETAGPARSER_H +#define LRSIMPLETAGPARSER_H + +#include +#include +#include + +namespace LimeReport{ + +class Tag{ +public: + Tag(QString text,int beginPos,int endPos) + :m_tagText(text),m_beginPos(beginPos),m_endPos(endPos){} + Tag():m_tagText(""),m_beginPos(-1),m_endPos(-1){} + bool isValid(){return (!m_tagText.isEmpty())&&(m_beginPos>0)&&(m_endPos>0);} + QString tagText() const {return m_tagText;} + int begin() const {return m_beginPos;} + int end() const {return m_endPos;} +private: + QString m_tagText; + int m_beginPos; + int m_endPos; +}; + +class Symb{ +public: + Symb(QString text, int pos):m_text(text),m_pos(pos){} + Symb():m_text(""),m_pos(-1){} + bool isValid(){return (!m_text.isEmpty())&&(m_pos>0);} + bool isTag(){return isValid()&&m_text.at(0)=='<';} + QString text(){return m_text;} + int pos(){return m_pos;} +private: + QString m_text; + int m_pos; +}; + +struct TagDiff{ + enum Direction { + Inner=0, + Outer=1 + }; + Tag* tag; + Direction direction; +}; + +class HtmlContext +{ +public: + HtmlContext(QString html); + ~HtmlContext(); + static QString extractWord(QString text,int index); + static QVector tagVectDiff(QVector source, QVector dest); + static bool isVectorEqual(QVector source, QVector dest); + void fillTagVector(QString html); + QString extendTextByTags(QString text, int pos); + QVector tagsAt(int pos); + Symb symbAt(int pos); + void clearTags(); + void clearSymbs(); +private: + static QString parseTag(QVector& storage,QString text,int& curPos, bool createTag=true); + void parseSymbs(QString text); + void initSymbPatterns(); +private: + QVector m_tags; + QVector m_symbs; + QStringList m_symbPatterns; +}; +} +#endif // LRSIMPLETAGPARSER_H diff --git a/src/items/lrsubitemparentpropitem.cpp b/src/items/lrsubitemparentpropitem.cpp new file mode 100644 index 0000000..3380660 --- /dev/null +++ b/src/items/lrsubitemparentpropitem.cpp @@ -0,0 +1,97 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrsubitemparentpropitem.h" +#include "../objectinspector/editors/lrcomboboxeditor.h" +#include "lrbasedesignintf.h" +#include "lritemdesignintf.h" +#include "lrpagedesignintf.h" +#include "lrobjectpropitem.h" + + +namespace{ + LimeReport::ObjectPropItem * createLocationPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::ItemLocationPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool registred = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("itemLocation","LimeReport::ItemDesignIntf"),QObject::tr("itemLocation"),createLocationPropItem + ); +} + +LimeReport::ItemLocationPropItem::ItemLocationPropItem(QObject* object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem* parent, bool readonly) + :LimeReport::ObjectPropItem(object, objects, name, displayName, value, parent, readonly){ + m_locationMap.insert("Band",LimeReport::ItemDesignIntf::Band); + m_locationMap.insert("Page",LimeReport::ItemDesignIntf::Page); +} + + +QWidget * LimeReport::ItemLocationPropItem::createProperyEditor(QWidget *parent) const{ + ComboBoxEditor *editor = new ComboBoxEditor(parent); + connect(editor,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotLocationChanged(QString))); + LimeReport::BaseDesignIntf *item=dynamic_cast(object()); + if (item){ + QStringList locationTypes; + foreach(QString location,m_locationMap.keys()){ + locationTypes.append(location); + } + editor->addItems(locationTypes); + } + return editor; +} + +QString LimeReport::ItemLocationPropItem::displayValue() const{ + return locationToString(static_cast(propertyValue().toInt())); +} + +void LimeReport::ItemLocationPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const{ + ComboBoxEditor *editor=qobject_cast(propertyEditor); + editor->setTextValue(locationToString(propertyValue().toInt())); +} + +void LimeReport::ItemLocationPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index){ + object()->setProperty(propertyName().toLatin1(),stringToLocation(qobject_cast(propertyEditor)->text())); + model->setData(index,object()->property(propertyName().toLatin1())); +} + +QString LimeReport::ItemLocationPropItem::locationToString(LimeReport::ItemDesignIntf::LocationType location) const{ + return m_locationMap.key(location); +} + +LimeReport::ItemDesignIntf::LocationType LimeReport::ItemLocationPropItem::stringToLocation(const QString &locationName){ + return m_locationMap.value(locationName); +} + +void LimeReport::ItemLocationPropItem::slotLocationChanged(const QString &text){ + if ( locationToString(object()->property(propertyName().toLatin1()).toInt())!=text){ + object()->setProperty(propertyName().toLatin1(),stringToLocation(text)); + dynamic_cast(sender())->setTextValue(locationToString(object()->property(propertyName().toLatin1()).toInt())); + } +} diff --git a/src/items/lrsubitemparentpropitem.h b/src/items/lrsubitemparentpropitem.h new file mode 100644 index 0000000..9aa420e --- /dev/null +++ b/src/items/lrsubitemparentpropitem.h @@ -0,0 +1,58 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRSUBITEMPARENTPROPITEM_H +#define LRSUBITEMPARENTPROPITEM_H + +#include + +#include "lrobjectpropitem.h" +#include "lritemdesignintf.h" + +namespace LimeReport{ +class ItemLocationPropItem : public LimeReport::ObjectPropItem{ + Q_OBJECT +public: + ItemLocationPropItem():ObjectPropItem(){} + ItemLocationPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly); + QWidget* createProperyEditor(QWidget *parent) const; + QString displayValue() const; + void setPropertyEditorData(QWidget *, const QModelIndex &) const; + void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &); +private slots: + void slotLocationChanged(const QString& text); +private: + QString locationToString(LimeReport::ItemDesignIntf::LocationType location) const; + QString locationToString(int location) const {return locationToString(static_cast(location));} + LimeReport::ItemDesignIntf::LocationType stringToLocation(const QString& locationName); +private: + QMap m_locationMap; +}; +} +#endif // LRSUBITEMPARENTPROPITEM_H diff --git a/src/items/lrtextitem.cpp b/src/items/lrtextitem.cpp new file mode 100644 index 0000000..1a83a14 --- /dev/null +++ b/src/items/lrtextitem.cpp @@ -0,0 +1,504 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include +#include + +#include "lrpagedesignintf.h" +#include "lrtextitem.h" +#include "lrdesignelementsfactory.h" +#include "lrglobal.h" +#include "lrdatasourcemanager.h" +#include "lrsimpletagparser.h" +#include "lrtextitemeditor.h" +#include "lrreportengine_p.h" + +namespace{ + +const QString xmlTag = "TextItem"; + +LimeReport::BaseDesignIntf * createTextItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::TextItem(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator(xmlTag, LimeReport::ItemAttribs(QObject::tr("Text Item"),"TextItem"), createTextItem); + +} + +namespace LimeReport{ + +TextItem::TextItem(QObject *owner, QGraphicsItem *parent) + : ContentItemDesignIntf(xmlTag,owner,parent), m_angle(Angle0),m_trimValue(true){ + m_text = new QTextDocument(); + Init(); +} + +TextItem::TextItem(const QString& text, QObject* owner /*= 0*/, QGraphicsItem* parent /*= 0*/) + : ContentItemDesignIntf(xmlTag, owner,parent), m_angle(Angle0), m_trimValue(true){ + m_strText = text; + m_text = new QTextDocument(text); + m_text->setHtml(replaceReturns(m_strText)); + initText(); + Init(); +} + +TextItem::~TextItem() +{ + delete m_text; +} + +void TextItem::paint(QPainter* ppainter, const QStyleOptionGraphicsItem* style, QWidget* widget) { + Q_UNUSED(widget); + Q_UNUSED(style); + + ppainter->save(); + + setupPainter(ppainter); + prepareRect(ppainter,style,widget); + + QSizeF tmpSize = rect().size()-m_textSize; + + if ((tmpSize.height()>0) && (m_alignment & Qt::AlignVCenter)) //allow html + ppainter->translate(0,tmpSize.height()/2); + + if ((tmpSize.height()>0) && (m_alignment & Qt::AlignBottom)) // allow html + ppainter->translate(0,tmpSize.height()); + + if (!ppainter->clipRegion().isEmpty()){ + QRegion clipReg=ppainter->clipRegion().xored(ppainter->clipRegion().subtracted(rect().toRect())); + ppainter->setClipRegion(clipReg); + } else { + ppainter->setClipRect(rect()); + } + + switch (m_angle){ + case Angle90: + ppainter->translate(width(),0); + ppainter->rotate(90); + break; + case Angle180: + ppainter->translate(width(),height()); + ppainter->rotate(180); + break; + case Angle270: + ppainter->translate(0,height()); + ppainter->rotate(270); + break; + case Angle45: + ppainter->translate(width()/2,0); + ppainter->rotate(45); + m_text->setTextWidth(sqrt(2*(pow(width()/2,2)))); + break; + case Angle315: + ppainter->translate(0,height()/2); + ppainter->rotate(315); + m_text->setTextWidth(sqrt(2*(pow(height()/2,2)))); + break; + default: + break; + } + + for(QTextBlock it=m_text->begin();it!=m_text->end();it=it.next()){ + for (int i=0;ilineCount();i++){ + ppainter->setOpacity(qreal(foregroundOpacity())/100); + it.layout()->lineAt(i).draw(ppainter,QPointF(marginSize(),0)); + } + } + + +// m_layout.draw(ppainter,QPointF(marginSize(),0),); +// ppainter->setFont(transformToSceneFont(font())); +// QTextOption o; +// o.setAlignment(alignment()); +// ppainter->drawText(rect(), content(), o); + + ppainter->restore(); + BaseDesignIntf::paint(ppainter, style, widget); +} + +QString TextItem::content() const{ + return m_strText; +} + +void TextItem::Init() +{ + m_autoWidth=NoneAutoWidth; + m_alignment= Qt::AlignLeft|Qt::AlignTop; + m_autoHeight=false; + m_text->setDefaultFont(transformToSceneFont(font())); + m_textSize=QSizeF(); + m_foregroundOpacity = 100; +} + +void TextItem::setContent(const QString &value) +{ + if (m_strText.compare(value)!=0){ + QString oldValue = m_strText; + m_strText=value; + m_text->setHtml(replaceReturns(value.trimmed())); + m_text->setTextWidth(width()); + m_textSize=m_text->size(); + if (!isLoading()){ + update(rect()); + notify("content",oldValue,value); + //updateLayout(); + } + } +} + +void TextItem::updateItemSize(RenderPass pass, int /*maxHeight*/) +{ + if (isNeedExpandContent()) + expandContent(pass); + if (!isLoading()) + initText(); + + if (m_textSize.width()>width() && ((m_autoWidth==MaxWordLength)||(m_autoWidth==MaxStringLength))){ + setWidth(m_textSize.width()); + } + + if ((m_textSize.height()>height()) && (m_autoHeight) ){ + setHeight(m_textSize.height()+5); + } +} + +void TextItem::updateLayout() +{ + m_layout.setFont(transformToSceneFont(font())); + m_layout.setText(content()); + qreal linePos = 0; + m_layout.beginLayout(); + while(true){ + QTextLine line = m_layout.createLine(); + if (!line.isValid()) break; + line.setLineWidth(width()-marginSize()*2); + line.setPosition(QPoint(marginSize(),linePos)); + linePos+=line.height(); + } + m_layout.endLayout(); +} + +bool TextItem::isNeedExpandContent() const +{ + QRegExp rx("$*\\{[^{]*\\}"); + return content().contains(rx); +} + +QString TextItem::replaceBR(QString text) +{ + return text.replace("
","\n"); +} + +QString TextItem::replaceReturns(QString text) +{ + QString result = text.replace("\r\n","
"); + result = result.replace("\n","
"); + return result; +} + +void TextItem::initText() +{ + QTextOption to; + to.setAlignment(m_alignment); + + if (m_autoWidth!=MaxStringLength) + to.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); + else to.setWrapMode(QTextOption::NoWrap); + + m_text->setDocumentMargin(marginSize()); + m_text->setDefaultTextOption(to); + m_text->setDefaultFont(transformToSceneFont(font())); + if ((m_angle==Angle0)||(m_angle==Angle180)){ + m_text->setTextWidth(rect().width()); + } else { + m_text->setTextWidth(rect().height()); + } + m_textSize=m_text->size(); +} +bool TextItem::trimValue() const +{ + return m_trimValue; +} + +void TextItem::setTrimValue(bool trimValue) +{ + m_trimValue = trimValue; +} + + +void TextItem::geometryChangedEvent(QRectF , QRectF) +{ + if ((m_angle==Angle0)||(m_angle==Angle180)){ + m_text->setTextWidth(rect().width()); + } else { + m_text->setTextWidth(rect().height()); + } + m_textSize=m_text->size(); +} + +bool TextItem::isNeedUpdateSize(RenderPass pass) const +{ + Q_UNUSED(pass) + bool res = (m_textSize.height()>geometry().height()&&autoHeight()) || + (m_textSize.width()>geometry().width()&&autoWidth()) || + isNeedExpandContent(); + return res; +} + +//void TextItem::setMarginSize(int value) +//{ +// if (m_margin!=value){ +// int oldValue = m_margin; +// m_margin=value; +// if (!isLoading()){ +// update(rect()); +// notify("margin", oldValue, value); +// } +// } +//} + +void TextItem::setAlignment(Qt::Alignment value) +{ + if (m_alignment!=value){ + Qt::Alignment oldValue = m_alignment; + m_alignment=value; + m_layout.setTextOption(QTextOption(m_alignment)); + if (!isLoading()){ + initText(); + update(rect()); + notify("alignment",QVariant(oldValue),QVariant(value)); + } + } +} + +void TextItem::expandContent(RenderPass pass) +{ + QString context=content(); + switch(pass){ + case FirstPass: + context=expandUserVariables(context, pass, NoEscapeSymbols); + context=expandScripts(context); + context=expandDataFields(context, NoEscapeSymbols); + break; + case SecondPass:; + context=expandUserVariables(context, pass, NoEscapeSymbols); + context=expandScripts(context); + } + + setContent(context); +} + +void TextItem::setAutoHeight(bool value) +{ + if (m_autoHeight!=value){ + bool oldValue = m_autoHeight; + m_autoHeight=value; + notify("autoHeight",oldValue,value); + } +} + +void TextItem::setAutoWidth(TextItem::AutoWidth value) +{ + if (m_autoWidth!=value){ + TextItem::AutoWidth oldValue = m_autoWidth; + m_autoWidth=value; + notify("autoWidth",oldValue,value); + } +} + +bool TextItem::canBeSplitted(int height) const +{ + return height>(m_text->begin().layout()->lineAt(0).height()); +} + +BaseDesignIntf *TextItem::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent) +{ + int linesHeight=0; + initText(); + QString tmpText=""; + TextItem* upperPart = dynamic_cast(cloneItem(itemMode(),owner,parent)); + + for (QTextBlock it=m_text->begin();it!=m_text->end();it=it.next()){ + for (int i=0;ilineCount();i++){ + linesHeight+=it.layout()->lineAt(i).height(); + if (linesHeight>(height-(marginSize()*2))) {linesHeight-=it.layout()->lineAt(i).height(); goto loop_exit;} + tmpText+=it.text().mid(it.layout()->lineAt(i).textStart(),it.layout()->lineAt(i).textLength())+'\n'; + } + } + loop_exit: + upperPart->setHeight(linesHeight+marginSize()*2); + QScopedPointer context(new HtmlContext(m_strText)); + upperPart->setContent(context->extendTextByTags(tmpText,0)); + return upperPart; +} + +BaseDesignIntf *TextItem::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) +{ + TextItem* bottomPart = dynamic_cast(cloneItem(itemMode(),owner,parent)); + int linesHeight=0; + int curLine=0; + QTextBlock curBlock; + + QString tmpText=""; + + for (curBlock=m_text->begin();curBlock!=m_text->end();curBlock=curBlock.next()){ + for (curLine=0;curLinelineCount();curLine++){ + linesHeight+=curBlock.layout()->lineAt(curLine).height(); + if (linesHeight>(height-(marginSize()*2))) {goto loop_exit;} + } + } + loop_exit:; + int textPos=0; + for (;curBlock!=m_text->end();curBlock=curBlock.next()){ + for (;curLinelineCount();curLine++){ + if (tmpText=="") textPos= curBlock.layout()->lineAt(curLine).textStart(); + tmpText+=curBlock.text().mid(curBlock.layout()->lineAt(curLine).textStart(), + curBlock.layout()->lineAt(curLine).textLength())+"\n"; + } + } + + QScopedPointer context(new HtmlContext(m_strText)); + bottomPart->setContent(context->extendTextByTags(tmpText,textPos)); + bottomPart->setHeight(bottomPart->m_textSize.height()+5); + return bottomPart; +} + +BaseDesignIntf *TextItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + return new TextItem(owner,parent); +} + +BaseDesignIntf *TextItem::cloneEmpty(int height, QObject *owner, QGraphicsItem *parent) +{ + TextItem* empty=dynamic_cast(cloneItem(itemMode(),owner,parent)); + empty->setContent(""); + empty->setHeight(height); + return empty; +} + +void TextItem::objectLoadFinished() +{ + ItemDesignIntf::objectLoadFinished(); + initText(); +} + +void TextItem::setTextItemFont(QFont value) +{ + if (font()!=value){ + QFont oldValue = font(); + setFont(value); + m_text->setDefaultFont(transformToSceneFont(value)); + notify("font",oldValue,value); + } +} + +QWidget *TextItem::defaultEditor() +{ + QSettings* l_settings = (page()->settings() != 0) ? + page()->settings() : + (page()->reportEditor()!=0) ? page()->reportEditor()->settings() : 0; + QWidget* editor = new TextItemEditor(this,page(),l_settings); + editor->setAttribute(Qt::WA_DeleteOnClose); + return editor; +} + +void TextItem::setBackgroundOpacity(int value) +{ + if (opacity()!=value){ + int oldValue = opacity(); + setOpacity(value); + notify("backgroundOpacity",oldValue,value); + } +} + +void TextItem::setBackgroundModeProperty(BaseDesignIntf::BGMode value) +{ + if (value!=backgroundMode()){ + BaseDesignIntf::BGMode oldValue = backgroundMode(); + setBackgroundMode(value); + notify("backgroundMode",oldValue,value); + } +} + +void TextItem::setBackgroundColorProperty(QColor value) +{ + if(value!=backgroundColor()){ + QColor oldValue = backgroundColor(); + setBackgroundColor(value); + notify("backgroundMode",oldValue,value); + } +} + +void TextItem::setFontColorProperty(QColor value) +{ + if(value!=fontColor()){ + QColor oldValue = fontColor(); + setFontColor(value); + notify("fontColor",oldValue,value); + } +} + +TextItem::AngleType TextItem::angle() const +{ + return m_angle; +} + +void TextItem::setAngle(const AngleType& value) +{ + if (m_angle!=value){ + AngleType oldValue = m_angle; + m_angle = value; + if (!isLoading()){ + initText(); + update(); + notify("angle",oldValue,value); + } + } +} + +void TextItem::setForegroundOpacity(int value) +{ + if (value>100){ + value=100; + } else if(value<0){ + value=0; + } + if (m_foregroundOpacity != value){ + int oldValue = m_foregroundOpacity; + m_foregroundOpacity = value; + update(); + notify("foregroundOpacity",oldValue,value); + } +} + +} //namespace LimeReport + + + diff --git a/src/items/lrtextitem.h b/src/items/lrtextitem.h new file mode 100644 index 0000000..f2e2abe --- /dev/null +++ b/src/items/lrtextitem.h @@ -0,0 +1,136 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRTEXTITEM_H +#define LRTEXTITEM_H +#include +#include +#include +#include "lritemdesignintf.h" +#include + +#include + +namespace LimeReport { + +class Tag; +class TextItem : public LimeReport::ContentItemDesignIntf { + Q_OBJECT + Q_ENUMS(AutoWidth) + Q_ENUMS(AngleType) + Q_PROPERTY(QString content READ content WRITE setContent) + Q_PROPERTY(int margin READ marginSize WRITE setMarginSize) + Q_PROPERTY(Qt::Alignment alignment READ alignment() WRITE setAlignment) + Q_PROPERTY(AutoWidth autoWidth READ autoWidth() WRITE setAutoWidth) + Q_PROPERTY(bool autoHeight READ autoHeight() WRITE setAutoHeight) + Q_PROPERTY(QFont font READ font() WRITE setTextItemFont) + Q_PROPERTY(int backgroundOpacity READ opacity WRITE setBackgroundOpacity) + Q_PROPERTY(BGMode backgroundMode READ backgroundMode WRITE setBackgroundModeProperty) + Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColorProperty) + Q_PROPERTY(QColor fontColor READ fontColor WRITE setFontColorProperty) + Q_PROPERTY(AngleType angle READ angle WRITE setAngle) + Q_PROPERTY(int foregroundOpacity READ foregroundOpacity WRITE setForegroundOpacity()) + Q_PROPERTY(bool trimValue READ trimValue WRITE setTrimValue) +public: + + enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength}; + enum AngleType{Angle0,Angle90,Angle180,Angle270,Angle45,Angle315}; + + void Init(); + TextItem(QObject* owner,QGraphicsItem* parent); + TextItem(const QString& content,QObject* owner = 0, QGraphicsItem* parent = 0); + ~TextItem(); + + void paint(QPainter* ppainter, const QStyleOptionGraphicsItem*, QWidget*); + QString content() const; + void setContent(const QString& value); + + //void setMarginSize(int value); + + + void setAlignment(Qt::Alignment value); + Qt::Alignment alignment(){return m_alignment;} + + virtual void geometryChangedEvent(QRectF, QRectF); + virtual bool isNeedUpdateSize(RenderPass) const; + virtual void updateItemSize(RenderPass pass, int); + void expandContent(RenderPass pass); + + void setAutoHeight(bool value); + bool autoHeight() const {return m_autoHeight;} + + void setAutoWidth(AutoWidth value); + AutoWidth autoWidth() const {return m_autoWidth;} + + bool canBeSplitted(int height) const; + bool isSplittable() const { return true;} + bool isEmpty() const{return m_text->isEmpty();} + BaseDesignIntf* cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent); + BaseDesignIntf* cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent); + BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); + BaseDesignIntf* cloneEmpty(int height, QObject *owner, QGraphicsItem *parent); + void objectLoadFinished(); + + void setTextItemFont(QFont value); + virtual QWidget* defaultEditor(); + void setBackgroundOpacity(int value); + void setBackgroundModeProperty(BGMode value); + void setBackgroundColorProperty(QColor value); + void setFontColorProperty(QColor value); + AngleType angle() const; + void setAngle(const AngleType& value); + int foregroundOpacity(){return m_foregroundOpacity;} + void setForegroundOpacity(int value); + + bool trimValue() const; + void setTrimValue(bool trimValue); + +protected: + void updateLayout(); + bool isNeedExpandContent() const; + QString replaceBR(QString text); + QString replaceReturns(QString text); +private: + void initText(); +private: + QString m_strText; + + QTextLayout m_layout; + QTextDocument* m_text; + Qt::Alignment m_alignment; + bool m_autoHeight; + AutoWidth m_autoWidth; + QSizeF m_textSize; + AngleType m_angle; + int m_foregroundOpacity; + bool m_trimValue; +}; + +} +#endif // LRTEXTITEM_H diff --git a/src/items/lrtextitemeditor.cpp b/src/items/lrtextitemeditor.cpp new file mode 100644 index 0000000..1d8842e --- /dev/null +++ b/src/items/lrtextitemeditor.cpp @@ -0,0 +1,356 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include "lrtextitemeditor.h" +#include "ui_lrtextitemeditor.h" + +#include "lrdatasourcemanager.h" +#include "lrscriptenginemanager.h" +#include "lrdatadesignintf.h" +#include "lrdatasourcemanager.h" +#include +#include + +TextItemEditor::TextItemEditor(LimeReport::TextItem *item, LimeReport::PageDesignIntf *page, QSettings* settings, QWidget *parent) : + QWidget(parent), + ui(new Ui::TextItemEditor), m_textItem(item), m_page(page), m_settings(settings), m_ownedSettings(false), m_isReadingSetting(false) +{ + ui->setupUi(this); + initUI(); + m_teContent->setPlainText(item->content()); + m_teContent->setFocus(); + setWindowIcon(QIcon(":/items/images/TextItem")); + readSetting(); +} + +TextItemEditor::~TextItemEditor() +{ +#ifdef Q_OS_WIN + writeSetting(); +#endif +#ifdef Q_OS_MAC + writeSetting(); +#endif + delete ui; +} + +void TextItemEditor::setSettings(QSettings* value) +{ + if (m_ownedSettings) + delete m_settings; + m_settings=value; + m_ownedSettings=false; + readSetting(); +} + +QSettings*TextItemEditor::settings() +{ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings = true; + return m_settings; + } +} + +void TextItemEditor::resizeEvent(QResizeEvent*) +{ +#ifdef Q_OS_UNIX + writeSetting(); +#endif +} + +void TextItemEditor::moveEvent(QMoveEvent*) +{ +#ifdef Q_OS_UNIX + writeSetting(); +#endif +} + +void TextItemEditor::on_pbOk_clicked() +{ + if (m_textItem->content()!=m_teContent->toPlainText()){ + m_textItem->setContent(m_teContent->toPlainText()); + } + close(); +} + +void TextItemEditor::initUI() +{ + QStringList dataWords; + m_teContent = ui->textEdit; + m_completer = new QCompleter(this); + m_teContent->setCompleter(m_completer); + + m_datasourcesMenu = new QMenu(this); + + LimeReport::DataSourceManager* dm = LimeReport::DataSourceManager::instance(); + if (dm){ + ui->twData->setModel(dm->datasourcesModel()); + ui->twScriptEngine->setModel(LimeReport::ScriptEngineManager::instance().model()); + + foreach(QString dsName,dm->dataSourceNames()){ + foreach(QString field, dm->fieldNames(dsName)){ + dataWords<tabWidget->setVisible(false); + } + + LimeReport::ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); + + foreach (LimeReport::ScriptFunctionDesc functionDesc, se.functionsDescriber()) { + dataWords<setModel(new QStringListModel(dataWords,m_completer)); + ui->gbSettings->setVisible(false); +} + +QStringListModel *TextItemEditor::getDataSources() +{ + LimeReport::DataSourceManager* dm= LimeReport::DataSourceManager::instance(); + QStringList dataSources; + foreach(QString dsName,dm->dataSourceNames()){ + dataSources<fieldNames(datasource)){ + fields<(sender()); + m_teContent->insertPlainText(action->whatsThis()); +} + +void TextItemEditor::readSetting() +{ + if (settings()==0) return; + + m_isReadingSetting = true; + + settings()->beginGroup("TextItemEditor"); + QVariant v = settings()->value("Geometry"); + if (v.isValid()){ + restoreGeometry(v.toByteArray()); + } + v = settings()->value("State"); + if (v.isValid()){ + ui->splitter->restoreState(v.toByteArray()); + } + + QVariant fontName = settings()->value("FontName"); + if (fontName.isValid()){ + QVariant fontSize = settings()->value("FontSize"); + ui->textEdit->setFont(QFont(fontName.toString(),fontSize.toInt())); + ui->editorFont->setCurrentFont(ui->textEdit->font()); + ui->editorFontSize->setValue(fontSize.toInt()); + } + settings()->endGroup(); + + m_isReadingSetting = false; +} + +void TextItemEditor::writeSetting() +{ + if (settings()!=0){ + settings()->beginGroup("TextItemEditor"); + settings()->setValue("Geometry",saveGeometry()); + settings()->setValue("State",ui->splitter->saveState()); + settings()->endGroup(); + } +} + + +CompleaterTextEditor::CompleaterTextEditor(QWidget *parent) + : QTextEdit(parent),m_compleater(0) +{ +} + +void CompleaterTextEditor::setCompleter(QCompleter *value) +{ + if (value) disconnect(value,0,this,0); + m_compleater = value; + if (!m_compleater) return; + m_compleater->setWidget(this); + m_compleater->setCompletionMode(QCompleter::PopupCompletion); + m_compleater->setCaseSensitivity(Qt::CaseInsensitive); + connect(m_compleater,SIGNAL(activated(QString)),this,SLOT(insertCompletion(QString))); +} + +void CompleaterTextEditor::keyPressEvent(QKeyEvent *e) +{ + if (m_compleater && m_compleater->popup()->isVisible()) { + switch (e->key()) { + case Qt::Key_Enter: + case Qt::Key_Return: + case Qt::Key_Escape: + case Qt::Key_Tab: + case Qt::Key_Backtab: + e->ignore(); + return; + default: + break; + } + } + + bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); + if (!m_compleater || !isShortcut) QTextEdit::keyPressEvent(e); + + const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); + if (!m_compleater || (ctrlOrShift && e->text().isEmpty())) + return; + + static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word + bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; + + QString completionPrefix = textUnderCursor(); + + if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 + || eow.contains(e->text().right(1)))) { + m_compleater->popup()->hide(); + return; + } + + if (completionPrefix != m_compleater->completionPrefix()) { + m_compleater->setCompletionPrefix(completionPrefix); + m_compleater->popup()->setCurrentIndex(m_compleater->completionModel()->index(0, 0)); + } + + QRect cr = cursorRect(); + cr.setWidth(m_compleater->popup()->sizeHintForColumn(0) + + m_compleater->popup()->verticalScrollBar()->sizeHint().width()); + m_compleater->complete(cr); + +} + +void CompleaterTextEditor::focusInEvent(QFocusEvent *e) +{ + if (m_compleater) m_compleater->setWidget(this); + QTextEdit::focusInEvent(e); +} + +QString CompleaterTextEditor::textUnderCursor() const +{ + QTextCursor tc = textCursor(); + tc.select(QTextCursor::WordUnderCursor); + return tc.selectedText(); +} + + +void CompleaterTextEditor::insertCompletion(const QString &completion) +{ + if (m_compleater->widget() != this) + return; + QTextCursor tc = textCursor(); + int extra = completion.length() - m_compleater->completionPrefix().length(); + tc.movePosition(QTextCursor::Left); + tc.movePosition(QTextCursor::EndOfWord); + tc.insertText(completion.right(extra)); + setTextCursor(tc); +} + +void TextItemEditor::on_twData_doubleClicked(const QModelIndex &index) +{ + if (!index.isValid()) return; + LimeReport::DataNode* node = static_cast(index.internalPointer()); + if (node->type()==LimeReport::DataNode::Field){ + m_teContent->insertPlainText(QString("$D{%1.%2}").arg(node->parent()->name()).arg(node->name())); + } + if (node->type()==LimeReport::DataNode::Variable){ + m_teContent->insertPlainText(QString("$V{%1}").arg(node->name())); + } +} + +void TextItemEditor::on_twScriptEngine_doubleClicked(const QModelIndex &index) +{ + if (!index.isValid()) return; + LimeReport::ScriptEngineNode* node = static_cast(index.internalPointer()); + if (node->type()==LimeReport::ScriptEngineNode::Function){ + m_teContent->insertPlainText(node->name()+"()"); + } +} + +void TextItemEditor::on_splitter_splitterMoved(int , int ) +{ +#ifdef unix + writeSetting(); +#endif +} + +void TextItemEditor::on_editorFont_currentFontChanged(const QFont &f) +{ + if (m_isReadingSetting) return; + QFont tmp = f; + tmp.setPointSize(ui->editorFontSize->value()); + ui->textEdit->setFont(tmp); + settings()->beginGroup("TextItemEditor"); + settings()->setValue("FontName",ui->textEdit->font().family()); + settings()->setValue("FontSize",ui->editorFontSize->value()); + settings()->endGroup(); +} + +void TextItemEditor::on_editorFontSize_valueChanged(int arg1) +{ + if (m_isReadingSetting) return; + ui->textEdit->setFont(QFont(ui->textEdit->font().family(),arg1)); + settings()->beginGroup("TextItemEditor"); + settings()->setValue("FontName",ui->textEdit->font().family()); + settings()->setValue("FontSize",ui->editorFontSize->value()); + settings()->endGroup(); +} + +void TextItemEditor::on_toolButton_clicked(bool checked) +{ + ui->gbSettings->setVisible(checked); +} diff --git a/src/items/lrtextitemeditor.h b/src/items/lrtextitemeditor.h new file mode 100644 index 0000000..e6ce2f5 --- /dev/null +++ b/src/items/lrtextitemeditor.h @@ -0,0 +1,106 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 3 of the * + * License, or (at your option) any later version. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRTEXTITEMEDITOR_H +#define LRTEXTITEMEDITOR_H + +#include +#include +#include + +#include "lrtextitem.h" +#include "lrpagedesignintf.h" + +namespace Ui { +class TextItemEditor; +} + +class CompleaterTextEditor :public QTextEdit +{ + Q_OBJECT +public: + CompleaterTextEditor(QWidget* parent=0); + void setCompleter(QCompleter* value); + QCompleter* compleater() const{ return m_compleater;} +protected: + virtual void keyPressEvent(QKeyEvent *e); + virtual void focusInEvent(QFocusEvent *e); +private: + QString textUnderCursor() const; +private slots: + void insertCompletion(const QString& completion); +private: + QCompleter* m_compleater; +}; + +class TextItemEditor : public QWidget +{ + Q_OBJECT +public: + explicit TextItemEditor(LimeReport::TextItem* item, LimeReport::PageDesignIntf* page, + QSettings* settings=0, QWidget *parent = 0); + ~TextItemEditor(); + void setSettings(QSettings* value); + QSettings* settings(); +protected: + void resizeEvent(QResizeEvent *); + void moveEvent(QMoveEvent *); +private slots: + void on_pbOk_clicked(); + void on_pbCancel_clicked(); + void slotFieldSelected(); + void on_twData_doubleClicked(const QModelIndex &index); + void on_twScriptEngine_doubleClicked(const QModelIndex &index); + void on_splitter_splitterMoved(int, int); + void on_editorFont_currentFontChanged(const QFont &f); + + void on_editorFontSize_valueChanged(int arg1); + + void on_toolButton_clicked(bool checked); + +private: + void initUI(); + void readSetting(); + void writeSetting(); + QStringListModel* getDataSources(); + QStringListModel* getPrefixes(); + QStringListModel* getColumns(QString datasource); +private: + Ui::TextItemEditor *ui; + LimeReport::TextItem* m_textItem; + LimeReport::PageDesignIntf* m_page; + QMenu* m_datasourcesMenu; + CompleaterTextEditor* m_teContent; + QCompleter* m_completer; + QSettings* m_settings; + bool m_ownedSettings; + bool m_isReadingSetting; +}; + +#endif // LRTEXTITEMEDITOR_H diff --git a/src/items/lrtextitemeditor.ui b/src/items/lrtextitemeditor.ui new file mode 100644 index 0000000..0934c90 --- /dev/null +++ b/src/items/lrtextitemeditor.ui @@ -0,0 +1,251 @@ + + + TextItemEditor + + + Qt::ApplicationModal + + + + 0 + 0 + 539 + 436 + + + + Text Item Editor + + + + :/items/images/insert-text_3.png:/items/images/insert-text_3.png + + + + + + + 0 + 0 + + + + Content + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + 12 + + + + + + QTabWidget::South + + + 0 + + + + Data + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + false + + + + + + + + Functions + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + false + + + + + + + + + + + + + + + Editor settings + + + + + + + + Editor font + + + + + + + + + + 11 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + ... + + + + :/items/images/settings.png:/items/images/settings.png + + + true + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Ok + + + + + + + Cancel + + + Esc + + + + + + + + + + CompleaterTextEditor + QTextEdit +